這篇文章主要介紹PHP設(shè)計模式之工廠模式的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(成都創(chuàng)新互聯(lián)公司).為客戶提供專業(yè)的服務(wù)器托管,四川各地服務(wù)器托管,服務(wù)器托管、多線服務(wù)器托管.托管咨詢專線:18982081108具體如下:
使用工廠模式的目的或目標?
工廠模式的較大優(yōu)點在于創(chuàng)建對象上面,就是把創(chuàng)建對象的過程封裝起來,這樣隨時可以產(chǎn)生一個新的對象。
減少代碼進行復(fù)制粘帖,耦合關(guān)系重,牽一發(fā)動其他部分代碼。
通俗的說,以前創(chuàng)建一個對象要使用new,現(xiàn)在把這個過程封裝起來了。
假設(shè)不使用工廠模式:那么很多地方調(diào)用類a,代碼就會這樣子創(chuàng)建一個實例:new a(),假設(shè)某天需要把a類的名稱修改,意味著很多調(diào)用的代碼都要修改。
工廠模式的優(yōu)點就在創(chuàng)建對象上。
工廠模式的優(yōu)點就在創(chuàng)建對象上。建立一個工廠(一個函數(shù)或一個類方法)來制造新的對象,它的任務(wù)就是把對象的創(chuàng)建過程都封裝起來,
創(chuàng)建對象不是使用new的形式了。而是定義一個方法,用于創(chuàng)建對象實例。
每個類可能會需要連接數(shù)據(jù)庫。那么就將連接數(shù)據(jù)庫封裝在一個類中。以后在其他類中通過類名:
為什么引入抽象的概念?
想一想,在現(xiàn)實生活中,當我們無法確定某個具體的東西的時候,往往把一類東西歸于抽象類別。
工廠方法:
比如你的工廠叫做“香煙工廠”,那么可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;
抽象工廠:無法描述它到底生產(chǎn)什么產(chǎn)品,它生產(chǎn)很多類型的產(chǎn)品(所以抽象工廠就會生成子工廠)。
你的工廠是綜合型的,是生產(chǎn)“一系列”產(chǎn)品,而不是“一個”,比如:生產(chǎn)“香煙”,還有“啤酒”等。然后它也可以有派生出來的具體的工廠,但這些工廠都是生產(chǎn)這一系列產(chǎn)品,只是可能因為地域不一樣,為了適應(yīng)當?shù)厝丝谖叮兜酪膊惶粯印?/p>
工廠模式:理解成只生成一種產(chǎn)品的工廠。比如生產(chǎn)香煙的。
工廠方法:工廠的一種產(chǎn)品生產(chǎn)線 。比如鍵盤的生成過程。
別人會反駁:吃飽了沒事干,一定要修改類名稱呢?這個說不定。一般都不會去修改類名稱。
其實工廠模式有很多變體,抓住精髓才是關(guān)鍵:只要是可以根據(jù)不同的參數(shù)生成不同的類實例,那么就符合工廠模式的設(shè)計思想。
這樣子讓我聯(lián)想到框架中經(jīng)常會有負責生成具體類實例的方法供調(diào)用。
由于前面使用過phpcms,用phpcms的來幫助理解,更加好,如下:
pc_base:load_app_class("order"');//參數(shù)名稱就是類名稱。
將會生成得到order這個實例。傳遞不同的參數(shù)得到不同的類實例,這個就符合工廠模式。
pc_base:load_app_class("comment"');//生成一個comment類實例
當然load_app_class這個方法里面還會結(jié)合了單件模式的思想。避免調(diào)用n次,就重復(fù)創(chuàng)建n個相同的實例
工廠模式我想到的一個典型的應(yīng)用就是:php可能要鏈接mysql,也可能要鏈接sqlserver,還有其他什么數(shù)據(jù)庫。那么做一個抽象的數(shù)據(jù)庫類,
這個類就是一個工廠類,專門負責產(chǎn)生不同的對象。
這樣子做很方便擴展。我們在直接鏈接數(shù)據(jù)庫的時候,不是使用代碼
new Mysql($host,$username,$password,$dbname)
的形式
而可以動態(tài)生成一個連接數(shù)據(jù)庫的實例??梢允莔ysql,也可以是連接oracle的。
class DbFactory { function static factory($db_class_name) { $db_class_name = strtolower($db_class_name); if (include_once 'Drivers/' . $db_class_name . '.php') { $classname = 'Driver_' . $db_class_name; return new $db_class_name; } else { throw new Exception ('對應(yīng)的數(shù)據(jù)庫類沒找到'); } } } DbFactory::factory("mysql"); DbFactory::factory("oracle");
在thinkphp框架中也有對應(yīng)的實現(xiàn):
Db.class.php就是一個工廠類(也可以叫做數(shù)據(jù)庫中間層,之所以叫做中間層,是因為可以操作mysql、oracle等各數(shù)據(jù)庫。而這個類就是中間層作用,屏蔽掉具體的實現(xiàn)。讓程序員可以不改動原來的查詢代碼。中間層來對接mysql、oracle等數(shù)據(jù)庫。
Db.class.php中有個factory()
方法來創(chuàng)建不同的數(shù)據(jù)庫實例
public function factory($db_config='') { // 讀取數(shù)據(jù)庫配置 $db_config = $this->parseConfig($db_config); if(empty($db_config['dbms'])) throw_exception(L('_NO_DB_CONFIG_')); // 數(shù)據(jù)庫類型 $this->dbType = ucwords(strtolower($db_config['dbms'])); $class = 'Db'. $this->dbType; if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) { // 內(nèi)置驅(qū)動 $path = CORE_PATH; }else{ // 擴展驅(qū)動 $path = EXTEND_PATH; } // 檢查驅(qū)動類 if(require_cache($path.'Driver/Db/'.$class.'.class.php')) { $db = new $class($db_config); // 獲取當前的數(shù)據(jù)庫類型 if( 'pdo' != strtolower($db_config['dbms']) ) $db->dbType = strtoupper($this->dbType); else $db->dbType = $this->_getDsnType($db_config['dsn']); if(APP_DEBUG) $db->debug = true; }else { // 類沒有定義 throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']); } return $db; }
還有做支付接口的時候,未來可能對應(yīng)不同的支付網(wǎng)關(guān):支付寶、財付通、網(wǎng)銀在線等。方便未來擴展,設(shè)計成工廠模式。定一個專門生產(chǎn)網(wǎng)關(guān)接口的工廠,抽象出來,做成接口形式,讓所有的子類都要實現(xiàn)它的接口。以后加一個支付方式,要使用哪一種支付方式,改變一下參數(shù)即可。
書籍<php權(quán)威編程>(英文名稱為PHP 5 Power Programming)也提到一個工廠模式的例子,學到一招:在為用戶注冊的時候,分為很多種角色的用戶。比如冊用戶,匿名用戶、管理員用戶等。完全使用可以使用工廠的思想來實現(xiàn),代碼也容易維護,為每種角色可以生成操作的類。
定義以下幾個類:
UserFactory 用戶工廠類,負責生成不同的用戶類
User:用戶類的基類,所有用戶類都是繼承這個類
不同角色的類:注冊用戶類、匿名用戶類、管理員用戶類
以上是“PHP設(shè)計模式之工廠模式的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
新聞名稱:PHP設(shè)計模式之工廠模式的示例分析-創(chuàng)新互聯(lián)
文章出自:http://aaarwkj.com/article14/dpiige.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、做網(wǎng)站、用戶體驗、網(wǎng)站設(shè)計、網(wǎng)站制作、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容