首先我們先引用一些概念:
工廠模式:專門定義一個類別來負責創建其他類別的實例,而創建的實例通常都具有其同的父類別。工廠模式屬於類別的創建模式,通常根據自變數的不同返回不同類別的實例。
工廠模式的實質是由一個工廠類別根據傳入的參量,動態決定應該創造哪一個產品的實例。工廠模式式涉及工廠角色、抽象產品角色和具體產品角色。
工廠(Creator)角色:是工廠模式的核心,它負責實現創造所有實例的內部邏。工廠類別可以被外界直接調用,創建所需產品物件。
抽象產品(Product)角色:是工廠模式所建立所有物件的父類,它負責描述所有實例所共有的公共介面。
具體產品(Concrete Product)角色:是工廠模式的創建目標,所有的物件都是扮演這個角色的某個特定類別的實例。
ZF中的zend_db就是工廠模式的一個很好的例子。
接下來就開始進行分析。 。 。 。 。 。
設定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的建構子就會被呼叫。
在建構函式中,透過Zend_Db::factory()我們就能得到一個操作資料庫的物件實例。
透過一個Zend_Config_Ini 實例讀取config.ini中相關資訊作為參數傳遞給工廠函數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(),如果我們使用傳統的方式,該怎麼操作
解答:
① 我們只需要在config.ini檔案中將PDO_MYSQL修改成PDO_MSSQL即可
② 傳統方式建立一個作業資料庫的物件實例:
其中:$config訊息從config.ini讀取
問題來了:我們使用傳統的方式來建立一個物件實例的話,我們必然有一個流程來判斷當前要操作的資料庫類型吧?
例如:
switch ($dbType){ case 'PDO_MYSQL': .... case 'PDO_MSSQL': .... case 'PDO_SQLITE': .... }
Zf中如何是如何實現工廠模式的呢?
首先,得有一個抽象基底類別:Zend_Db_Adapter_Abstract,該類別是工廠模式所建立的所有物件的父類,他負責提供所有實例要所共有的介面。該類別不僅提供了一些我們非常熟悉操作資料庫的實現方法,例如:select,update,insert,delete,query,fetchRow,fetchAssoc;另外,也提供了一些接口,用以在子類別中進行實現,例如: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 { //...实现针对Mysql数据库的操作 } class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Mssql数据库的操作 } class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Sqlite数据库的操作 }