首先我們先引用一些概念:?
工廠模式:專門定義一個類別來負責創(chuàng)建其他類別的實例,而創(chuàng)建的實例通常都具有其同的父類別。工廠模式屬於類別的創(chuàng)建模式,通常根據(jù)自變數(shù)的不同返回不同類別的實例。?
工廠模式的實質(zhì)是由一個工廠類別根據(jù)傳入的參量,動態(tài)決定應(yīng)該創(chuàng)造哪一個產(chǎn)品的實例。工廠模式式涉及工廠角色、抽象產(chǎn)品角色和具體產(chǎn)品角色。?
工廠(Creator)角色:是工廠模式的核心,它負責實現(xiàn)創(chuàng)造所有實例的內(nèi)部邏。工廠類別可以被外界直接調(diào)用,創(chuàng)建所需產(chǎn)品物件。?
抽象產(chǎn)品(Product)角色:是工廠模式所建立所有物件的父類,它負責描述所有實例所共有的公共介面。?
具體產(chǎn)品(Concrete Product)角色:是工廠模式的創(chuàng)建目標,所有的物件都是扮演這個角色的某個特定類別的實例。?
ZF中的zend_db就是工廠模式的一個很好的例子。?
接下來就開始進行分析。 。 。 。 。 。?
設(shè)定zf的時候,我們可以將資料庫的連線操作資訊放在Bootstrap.php檔案中?
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { function __construct($app){ parent::__construct($app); $url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini'; $dbconfig=new Zend_Config_Ini($url,null,true); $db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray()); // var_dump($db); $db->query('SET NAMES UTF8'); Zend_Db_Table::setDefaultAdapter($db); } } ?>
在入口檔案處,透過一個Zend_Application物件來呼叫bootstrap(),類別Bootstrap的建構(gòu)子就會被呼叫。?
在建構(gòu)函式中,透過Zend_Db::factory()我們就能得到一個操作資料庫的物件實例。
透過一個Zend_Config_Ini 實例讀取config.ini中相關(guān)資訊作為參數(shù)傳遞給工廠函數(shù)Zend_Db::factory()?
config.ini 的資訊?
[general]?
db.adapter =PDO_MY?
[general]?
db.adapter =PDO_MY?
[general]?
db.adapter =PDO_MY?
[general]?
db.adapter =PDO_MY?
[geneampms. db.params.username =root?
db.params.password =?
db.params.dbname = 資料庫名稱?
Zend_Db::factory()?
表示連接資料庫的信息,包括伺服器名,用戶名,密碼,要連接的資料庫?
先拋出兩個提個問題:?
①如果我們要操作的資料庫是MSSQL,該怎麼操作?
②這裡我們使用的是Zend_Db::factory(),如果我們使用傳統(tǒng)的方式,該怎麼操作?
解答:?
① 我們只需要在config.ini檔案中將PDO_MYSQL修改成PDO_MSSQL即可?
② 傳統(tǒng)方式建立一個作業(yè)資料庫的物件實例:?
其中:$config訊息從config.ini讀取?
問題來了:我們使用傳統(tǒng)的方式來建立一個物件實例的話,我們必然有一個流程來判斷當前要操作的資料庫類型吧?
例如:?
switch ($dbType){ case 'PDO_MYSQL': .... case 'PDO_MSSQL': .... case 'PDO_SQLITE': .... }
我們還得根據(jù)不同的資料庫類型,寫不同的作業(yè)資料庫的語句,這樣豈不是很麻煩?
但是,這一切的一切,zf透過工廠模式都已經(jīng)幫我們做好了,使用起來非常方便?
Zf中如何是如何實現(xiàn)工廠模式的呢??
首先,得有一個抽象基底類別:Zend_Db_Adapter_Abstract,該類別是工廠模式所建立的所有物件的父類,他負責提供所有實例要所共有的介面。該類別不僅提供了一些我們非常熟悉操作資料庫的實現(xiàn)方法,例如:select,update,insert,delete,query,fetchRow,fetchAssoc;另外,也提供了一些接口,用以在子類別中進行實現(xiàn),例如:limit,getServerVersion,closeConnection,describeTable等等?
abstract class Zend_Db_Adapter_Abstract { //.. } abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract { //.. } class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract { //...實現(xiàn)針對Mysql數(shù)據(jù)庫的操作 } class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract { //....實現(xiàn)針對Mssql數(shù)據(jù)庫的操作 } class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract { //....實現(xiàn)針對Sqlite數(shù)據(jù)庫的操作 }以上關(guān)係可以用一張圖簡單的表示出來? ??接下來,我們跟蹤下Zend_Db::Factory()到底是實現(xiàn)根據(jù)不同的參數(shù)選擇不同的資料庫的。?????更多工廠模式在Zend Framework應(yīng)用介紹相關(guān)文章請關(guān)注PHP中文網(wǎng)! ??

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)