學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)工廠模式(factory)
一、意圖
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method使用一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)【GOF95】
二、工廠模式結(jié)構(gòu)圖

三、工廠模式中主要角色
抽象產(chǎn)品(Product)角色:具體產(chǎn)品對(duì)象共有的父類(lèi)或接口
具體產(chǎn)品(Concrete Product)角色:實(shí)現(xiàn)抽象產(chǎn)品角色所定義的接口,并且工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象都是某具體產(chǎn)品對(duì)象的實(shí)例
抽象工廠(Creator)角色:模式中任何創(chuàng)建對(duì)象的工廠類(lèi)都要實(shí)現(xiàn)這個(gè)接口,它聲明了工廠方法,該方法返回一個(gè)Product類(lèi)型的對(duì)象。
Creator也可以定義一個(gè)工廠方法的缺省實(shí)現(xiàn),它返回一個(gè)缺省的的ConcreteProduct對(duì)象
具體工廠(Concrete Creator)角色:實(shí)現(xiàn)抽象工廠接口,具體工廠角色與應(yīng)用邏輯相關(guān),由應(yīng)用程序直接調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。
四、工廠模式的優(yōu)點(diǎn)和缺點(diǎn)
工廠模式的優(yōu)點(diǎn):
工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠模式的缺點(diǎn):
客戶(hù)可能僅僅為了創(chuàng)建一個(gè)特定的ConcreteProduct對(duì)象,就不得不創(chuàng)建一個(gè)Creator子類(lèi)
五、工廠模式適用場(chǎng)景
1、當(dāng)一個(gè)類(lèi)不知道它所必須創(chuàng)建的對(duì)象的類(lèi)的時(shí)候
2、當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候
3、當(dāng)類(lèi)將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類(lèi)的某一個(gè),并且你希望將哪一個(gè)幫助子類(lèi)是代理者這一信息局部化的時(shí)候
六、工廠模式與其它模式
抽象工廠模式(abstract factory模式):Abstract Factory模式經(jīng)常使用工廠方法來(lái)實(shí)現(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 {
/**
* 接口方法實(shí)現(xiàn) 輸出特定字符串
*/
public function operation() {
echo 'ConcreteProductA <br />';
}
}
/**
* 具體產(chǎn)品角色B
*/
class ConcreteProductB implements Product {
/**
* 接口方法實(shí)現(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ǎn)單工廠模式
工廠方法模式與簡(jiǎn)單工廠模式再結(jié)構(gòu)上的不同不是很明顯。工廠方法類(lèi)的核心是一個(gè)抽象工廠類(lèi),而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類(lèi)上。
工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類(lèi)都有共同的接口,或者有共同的抽象父類(lèi)。
當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶(hù)端,很好的符合了”開(kāi)放-封閉”原則。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。
工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。
以上就是使用php實(shí)現(xiàn)工廠模式的代碼,還有一些關(guān)于工廠模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。
- php設(shè)計(jì)模式 Factory(工廠模式)
- PHP設(shè)計(jì)模式之工廠模式(Factory Pattern)的講解
- PHP設(shè)計(jì)模式之工廠模式(Factory)入門(mén)與應(yīng)用詳解
- PHP設(shè)計(jì)模式概論【概念、分類(lèi)、原則等】
- PHP設(shè)計(jì)模式之 策略模式Strategy詳解【對(duì)象行為型】
- php設(shè)計(jì)模式 Template (模板模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- php設(shè)計(jì)模式 DAO(數(shù)據(jù)訪問(wèn)對(duì)象模式)
- PHP經(jīng)典面試題之設(shè)計(jì)模式(經(jīng)常遇到)
- PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
相關(guān)文章
php實(shí)現(xiàn)excel中rank函數(shù)功能的方法
這篇文章主要介紹了php實(shí)現(xiàn)excel中rank函數(shù)功能的方法,較為詳細(xì)的分析了rank函數(shù)的功能及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2015-01-01
php+jQuery+Ajax實(shí)現(xiàn)點(diǎn)贊效果的方法(附源碼下載)
這篇文章主要介紹了php+jQuery+Ajax實(shí)現(xiàn)點(diǎn)贊效果的方法,結(jié)合實(shí)例形式詳細(xì)介紹了php結(jié)合jQuery的ajax無(wú)刷新提交實(shí)現(xiàn)點(diǎn)贊功能的具體步驟與相關(guān)技巧,需要的朋友可以參考下2015-12-12
PHP 命名空間和自動(dòng)加載原理與用法實(shí)例分析
這篇文章主要介紹了PHP 命名空間和自動(dòng)加載,結(jié)合實(shí)例形式分析了PHP 命名空間和自動(dòng)加載具體功能、概念、原理與使用技巧,需要的朋友可以參考下2020-04-04
php class中self,parent,this的區(qū)別以及實(shí)例介紹
我容易混淆public,private,protected,還容易混淆this,self這些東西。前面已經(jīng)寫(xiě)了一篇關(guān)于public,private,protected 博文了,下面來(lái)說(shuō)一下this,self,parent的用法2013-04-04
php腳本守護(hù)進(jìn)程原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了php腳本守護(hù)進(jìn)程原理與實(shí)現(xiàn)方法,較為詳細(xì)的分析了php腳本守護(hù)進(jìn)程的實(shí)現(xiàn)思路、原理、格式及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07
Centos 6.5下PHP 5.3安裝ffmpeg擴(kuò)展的步驟詳解
大家都知道ffmpeg是一款視頻流的軟件了,我們?cè)趌inux系統(tǒng)中可以安裝ffmpeg了,這篇文章主要介紹了在Centos 6.5下PHP 5.3安裝ffmpeg擴(kuò)展的步驟,需要的朋友可以參考下。2017-03-03
php模擬post提交請(qǐng)求調(diào)用接口示例解析
這篇文章主要介紹了php模擬post提交請(qǐng)求調(diào)用接口示例解析,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

