學(xué)習(xí)php設(shè)計模式 php實現(xiàn)工廠模式(factory)
一、意圖
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使用一個類的實例化延遲到其子類【GOF95】
二、工廠模式結(jié)構(gòu)圖
三、工廠模式中主要角色
抽象產(chǎn)品(Product)角色:具體產(chǎn)品對象共有的父類或接口
具體產(chǎn)品(Concrete Product)角色:實現(xiàn)抽象產(chǎn)品角色所定義的接口,并且工廠方法模式所創(chuàng)建的每一個對象都是某具體產(chǎn)品對象的實例
抽象工廠(Creator)角色:模式中任何創(chuàng)建對象的工廠類都要實現(xiàn)這個接口,它聲明了工廠方法,該方法返回一個Product類型的對象。
Creator也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的的ConcreteProduct對象
具體工廠(Concrete Creator)角色:實現(xiàn)抽象工廠接口,具體工廠角色與應(yīng)用邏輯相關(guān),由應(yīng)用程序直接調(diào)用以創(chuàng)建產(chǎn)品對象。
四、工廠模式的優(yōu)點和缺點
工廠模式的優(yōu)點:
工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠模式的缺點:
客戶可能僅僅為了創(chuàng)建一個特定的ConcreteProduct對象,就不得不創(chuàng)建一個Creator子類
五、工廠模式適用場景
1、當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的時候
2、當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候
3、當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個幫助子類的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候
六、工廠模式與其它模式
抽象工廠模式(abstract factory模式):Abstract Factory模式經(jīng)常使用工廠方法來實現(xiàn)
Template Method模式: 工廠方法通常在Template Methods中被調(diào)用
七、工廠模式PHP示例
<?php /** * 抽象工廠角色 */ interface Creator { public function factoryMethod(); } /** * 具體工廠角色A */ class ConcreteCreatorA implements Creator { /** * 工廠方法 返回具體 產(chǎn)品A * @return ConcreteProductA */ public function factoryMethod() { return new ConcreteProductA(); } } /** * 具體工廠角色B */ class ConcreteCreatorB implements Creator { /** * 工廠方法 返回具體 產(chǎn)品B * @return ConcreteProductB */ public function factoryMethod() { return new ConcreteProductB(); } } /** * 抽象產(chǎn)品角色 */ interface Product { public function operation(); } /** * 具體產(chǎn)品角色A */ class ConcreteProductA implements Product { /** * 接口方法實現(xiàn) 輸出特定字符串 */ public function operation() { echo 'ConcreteProductA <br />'; } } /** * 具體產(chǎn)品角色B */ class ConcreteProductB implements Product { /** * 接口方法實現(xiàn) 輸出特定字符串 */ public function operation() { echo 'ConcreteProductB <br />'; } } class Client { /** * Main program. */ public static function main() { $creatorA = new ConcreteCreatorA(); $productA = $creatorA->factoryMethod(); $productA->operation(); $creatorB = new ConcreteCreatorB(); $productB = $creatorB->factoryMethod(); $productB->operation(); } } Client::main(); ?>
八、區(qū)分工廠方法模式與簡單工廠模式
工廠方法模式與簡單工廠模式再結(jié)構(gòu)上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式之所以有一個別名叫多態(tài)性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。
當(dāng)系統(tǒng)擴展需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好的符合了”開放-封閉”原則。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴展性不好。
工廠方法模式退化后可以演變成簡單工廠模式。
以上就是使用php實現(xiàn)工廠模式的代碼,還有一些關(guān)于工廠模式的概念區(qū)分,希望對大家的學(xué)習(xí)有所幫助。
- php設(shè)計模式 Factory(工廠模式)
- PHP設(shè)計模式之工廠模式(Factory Pattern)的講解
- PHP設(shè)計模式之工廠模式(Factory)入門與應(yīng)用詳解
- PHP設(shè)計模式概論【概念、分類、原則等】
- PHP設(shè)計模式之 策略模式Strategy詳解【對象行為型】
- php設(shè)計模式 Template (模板模式)
- PHP常用的三種設(shè)計模式匯總
- php設(shè)計模式 DAO(數(shù)據(jù)訪問對象模式)
- PHP經(jīng)典面試題之設(shè)計模式(經(jīng)常遇到)
- PHP設(shè)計模式(一)工廠模式Factory實例詳解【創(chuàng)建型】
相關(guān)文章
PHP 實現(xiàn)代碼復(fù)用的一個方法 traits新特性
這篇文章主要介紹了PHP 實現(xiàn)代碼復(fù)用的一個方法,traits的新特性的相關(guān)資料,需要的朋友可以參考下2015-02-02php 按指定元素值去除數(shù)組元素的實現(xiàn)方法
php 按指定元素值去除數(shù)組元素的實現(xiàn)方法,需要的朋友可以參考下。2011-11-11php+mysqli使用面向?qū)ο蠓绞礁聰?shù)據(jù)庫實例
這篇文章主要介紹了php+mysqli使用面向?qū)ο蠓绞礁聰?shù)據(jù)庫的方法,實例分析了mysqli對象的創(chuàng)建、連接、更新及返回更新結(jié)果的技巧,需要的朋友可以參考下2015-01-01PHP截取漢字亂碼問題解決方法mb_substr函數(shù)的應(yīng)用
利用mb_substr截取字符串不會出現(xiàn)亂碼問題,高手可以飛過......2008-03-03php+jQuery+Ajax實現(xiàn)點贊效果的方法(附源碼下載)
這篇文章主要介紹了php+jQuery+Ajax實現(xiàn)點贊效果的方法,結(jié)合實例形式詳細(xì)介紹了php結(jié)合jQuery的ajax無刷新提交實現(xiàn)點贊功能的具體步驟與相關(guān)技巧,需要的朋友可以參考下2015-12-12