學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)建造者模式
建造者模式可以讓一個(gè)產(chǎn)品的內(nèi)部表象和和產(chǎn)品的生產(chǎn)過程分離開,從而可以生成具有不同內(nèi)部表象的產(chǎn)品。
一、Builder模式結(jié)構(gòu)圖
二、Builder模式中主要角色
抽象建造者(Builder)角色:定義一個(gè)抽象接口,規(guī)范產(chǎn)品各個(gè)組成成分的建造(即規(guī)范具體建造者的方法實(shí)現(xiàn))。其中所規(guī)范的方法中必須包括建造方法和結(jié)果返回方法
具體建造者(ConcreteBuilder)角色:實(shí)現(xiàn)抽象建造者角色所定義的方法。具體建造者與業(yè)務(wù)邏輯關(guān)聯(lián)性較大,應(yīng)用程序最終會(huì)通過調(diào)用此角色中所實(shí)現(xiàn)的建造方法按照業(yè)務(wù)邏輯創(chuàng)建產(chǎn)品,在建造完成后通過結(jié)果返回方法返回建造的產(chǎn)品實(shí)例。一般在外部由客戶或一個(gè)抽象工廠創(chuàng)建。
導(dǎo)演者(Director)角色:此角色的作用是調(diào)用具體的建造者角色建造產(chǎn)品。導(dǎo)演者與產(chǎn)品類沒有直接關(guān)系,與產(chǎn)品類交談的是具體抽象角色。
產(chǎn)品(Product)角色:在指導(dǎo)者的指導(dǎo)下由建造者所創(chuàng)建的那個(gè)復(fù)雜的對象
導(dǎo)演者角色與客戶端直接打交道,它理解客戶端的業(yè)務(wù)邏輯,將客戶端創(chuàng)建產(chǎn)品的請求拆分成對產(chǎn)品組成部分的請求,然后調(diào)用具體產(chǎn)品角色執(zhí)行建造操作。它分離了客戶端與具體建造者。
三、Builder模式的優(yōu)缺點(diǎn)
Builder模式的優(yōu)點(diǎn): 建造者模式可以很好的將一個(gè)對象的實(shí)現(xiàn)與相關(guān)的“業(yè)務(wù)”邏輯分離開來,從而可以在不改變事件邏輯的前提下,使增加(或改變)實(shí)現(xiàn)變得非常容易。
Builder模式的缺點(diǎn): 建造者接口的修改會(huì)導(dǎo)致所有執(zhí)行類的修改。
四、Builder模式的使用場景與效果
以下情況應(yīng)當(dāng)使用建造者模式:
1、 需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2、 需要生成的產(chǎn)品對象的屬性相互依賴,建造者模式可以強(qiáng)迫生成順序。
3、 在對象創(chuàng)建過程中會(huì)使用到系統(tǒng)中的一些其它對象,這些對象在產(chǎn)品對象的創(chuàng)建過程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得產(chǎn)品的內(nèi)部表象可以獨(dú)立的變化。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
2、 每一個(gè)Builder都相對獨(dú)立,而與其它的Builder無關(guān)。
3、 模式所建造的最終產(chǎn)品更易于控制。
五、Builder模式與其它模式
抽象工廠模式(abstract factory模式):在抽象工廠模式中,每一次工廠對象被調(diào)用時(shí)都會(huì)返還一個(gè)完整的產(chǎn)品對象,而客戶端可能會(huì)將這些產(chǎn)品組裝成一個(gè)更大更復(fù)雜的產(chǎn)品,也可能不會(huì)。建造者模式則不同,它一點(diǎn)一點(diǎn)地建造出一個(gè)復(fù)雜的產(chǎn)品,而這個(gè)產(chǎn)品的組裝過程發(fā)生在建造者內(nèi)部。二者的區(qū)別在于是否有組裝過程,組裝過程發(fā)生的位置。這兩個(gè)設(shè)計(jì)模式可以連起來用,客戶端通過調(diào)用一個(gè)建造角色,間接調(diào)用另一個(gè)抽象工廠模式的工廠角色。工廠模式返還不同產(chǎn)品族的零件,而建造者模式則把它們組裝起來。
策略模式(strategy模式):建造者模式在結(jié)構(gòu)上很接近于策略模式,事實(shí)上建造者模式是策略模式的一種特殊情況。二者的區(qū)別在于用意不同。建造者模式作用于客戶端一點(diǎn)一點(diǎn)的建造新的對象,而策略模式的目的是為算法提供抽象的接口。
建造者模式與模板方法模式:建造者模式在退化、失去導(dǎo)演者角色后,可以發(fā)展到模板方法模式(即將建造過程的算法實(shí)現(xiàn)放在建造角色中)。
建造者模式與合成模式:合成模式描述一個(gè)對象樹的組成結(jié)構(gòu),而建造者模式則可以用來描述對象樹的生成過程。
以上4點(diǎn)來自《Java與模式》
六、Builder模式PHP示例
<?php /** * 產(chǎn)品 * 此處僅以一個(gè)產(chǎn)品類中的字符串演示產(chǎn)品 */ class Product { /** * 產(chǎn)品的組成部分集合 */ private $_parts; public function __construct() { $this->_parts = array(); } public function add($part) { return array_push($this->_parts, $part); } public function show() { echo "the product include:"; array_map('printf', $this->_parts); } } /** * 抽象建造者 */ abstract class Builder { /** * 產(chǎn)品零件構(gòu)造方法1 */ public abstract function buildPart1(); /** * 產(chǎn)品零件構(gòu)造方法2 */ public abstract function buildPart2(); /** * 產(chǎn)品返還方法 */ public abstract function getResult(); } /** * 具體建造者 */ class ConcreteBuilder extends Builder { private $_product; public function __construct() { $this->_product = new Product(); } public function buildPart1() { $this->_product->add("Part1"); } public function buildPart2() { $this->_product->add("Part2"); } public function getResult() { return $this->_product; } } /** * 導(dǎo)演者 */ class Director { public function __construct(Builder $builder) { $builder->buildPart1(); $builder->buildPart2(); } } class Client { /** * Main program. */ public static function main() { $buidler = new ConcreteBuilder(); $director = new Director($buidler); $product = $buidler->getResult(); $product->show(); } } Client::main(); ?>
以上就是使用php實(shí)現(xiàn)建造者模式的代碼,還有一些關(guān)于建造者模式的概念區(qū)分,希望對大家的學(xué)習(xí)有所幫助。
- PHP設(shè)計(jì)模式之建造者模式(Builder)原理與用法案例詳解
- php設(shè)計(jì)模式 Builder(建造者模式)
- PHP設(shè)計(jì)模式之建造者模式定義與用法簡單示例
- PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
- PHP設(shè)計(jì)模式概論【概念、分類、原則等】
- PHP設(shè)計(jì)模式之 策略模式Strategy詳解【對象行為型】
- php設(shè)計(jì)模式 Template (模板模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- php單態(tài)設(shè)計(jì)模式(單例模式)實(shí)例
- PHP經(jīng)典面試題之設(shè)計(jì)模式(經(jīng)常遇到)
- php設(shè)計(jì)模式小結(jié)
- PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
相關(guān)文章
PHP商品秒殺問題解決方案實(shí)例詳解【mysql與redis】
這篇文章主要介紹了PHP商品秒殺問題解決方案,結(jié)合實(shí)例形式詳細(xì)分析了php結(jié)合mysql與redis實(shí)現(xiàn)商品秒殺功能的相關(guān)操作技巧及注意事項(xiàng),需要的朋友可以參考下2019-07-07解析VS2010利用VS.PHP插件調(diào)試PHP的方法
以下是對VS2010利用VS.PHP插件調(diào)試PHP的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07php+xml結(jié)合Ajax實(shí)現(xiàn)點(diǎn)贊功能完整實(shí)例
這篇文章主要介紹了php+xml結(jié)合Ajax實(shí)現(xiàn)點(diǎn)贊功能的方法,以一個(gè)完整實(shí)例形式詳細(xì)分析了XML文件、html頁面以及Ajax結(jié)合php實(shí)現(xiàn)點(diǎn)贊功能的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01PHP利用PHPMailer實(shí)現(xiàn)郵件發(fā)送功能
phpMailer是一個(gè)非常強(qiáng)大的php發(fā)送郵件類,可以設(shè)定發(fā)送郵件地址、回復(fù)地址、郵件主題、html網(wǎng)頁,上傳附件,并且使用起來非常方便。本文將利用它實(shí)現(xiàn)郵件發(fā)送功能,需要的可以參考一下2022-03-03Highcharts?圖表中圖例顯示狀態(tài)存儲(chǔ)的功能設(shè)計(jì)詳解
這篇文章主要介紹了Highcharts?圖表中圖例顯示狀態(tài)存儲(chǔ)的功能設(shè)計(jì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03PHP 的ArrayAccess接口 像數(shù)組一樣來訪問你的PHP對象
如果想讓對象使用起來像一個(gè) PHP 數(shù)組,那么我們需要實(shí)現(xiàn) ArrayAccess 接口2010-10-10