溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在php項目中實現(xiàn)一個建造者模式

發(fā)布時間:2021-01-29 16:28:06 來源:億速云 閱讀:184 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹怎么在php項目中實現(xiàn)一個建造者模式,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

建造者模式可以讓一個產(chǎn)品的內(nèi)部表象和和產(chǎn)品的生產(chǎn)過程分離開,從而可以生成具有不同內(nèi)部表象的產(chǎn)品。
一、Builder模式結(jié)構(gòu)圖

 怎么在php項目中實現(xiàn)一個建造者模式

二、Builder模式中主要角色
抽象建造者(Builder)角色:定義一個抽象接口,規(guī)范產(chǎn)品各個組成成分的建造(即規(guī)范具體建造者的方法實現(xiàn))。其中所規(guī)范的方法中必須包括建造方法和結(jié)果返回方法
具體建造者(ConcreteBuilder)角色:實現(xiàn)抽象建造者角色所定義的方法。具體建造者與業(yè)務(wù)邏輯關(guān)聯(lián)性較大,應(yīng)用程序最終會通過調(diào)用此角色中所實現(xiàn)的建造方法按照業(yè)務(wù)邏輯創(chuàng)建產(chǎn)品,在建造完成后通過結(jié)果返回方法返回建造的產(chǎn)品實例。一般在外部由客戶或一個抽象工廠創(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)建的那個復(fù)雜的對象
導(dǎo)演者角色與客戶端直接打交道,它理解客戶端的業(yè)務(wù)邏輯,將客戶端創(chuàng)建產(chǎn)品的請求拆分成對產(chǎn)品組成部分的請求,然后調(diào)用具體產(chǎn)品角色執(zhí)行建造操作。它分離了客戶端與具體建造者。
三、Builder模式的優(yōu)缺點
Builder模式的優(yōu)點: 建造者模式可以很好的將一個對象的實現(xiàn)與相關(guān)的“業(yè)務(wù)”邏輯分離開來,從而可以在不改變事件邏輯的前提下,使增加(或改變)實現(xiàn)變得非常容易。
Builder模式的缺點: 建造者接口的修改會導(dǎo)致所有執(zhí)行類的修改。
四、Builder模式的使用場景與效果
以下情況應(yīng)當(dāng)使用建造者模式:
1、 需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2、 需要生成的產(chǎn)品對象的屬性相互依賴,建造者模式可以強迫生成順序。
3、 在對象創(chuàng)建過程中會使用到系統(tǒng)中的一些其它對象,這些對象在產(chǎn)品對象的創(chuàng)建過程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得產(chǎn)品的內(nèi)部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié)。
2、 每一個Builder都相對獨立,而與其它的Builder無關(guān)。
3、 模式所建造的最終產(chǎn)品更易于控制。
五、Builder模式與其它模式
抽象工廠模式(abstract factory模式):在抽象工廠模式中,每一次工廠對象被調(diào)用時都會返還一個完整的產(chǎn)品對象,而客戶端可能會將這些產(chǎn)品組裝成一個更大更復(fù)雜的產(chǎn)品,也可能不會。建造者模式則不同,它一點一點地建造出一個復(fù)雜的產(chǎn)品,而這個產(chǎn)品的組裝過程發(fā)生在建造者內(nèi)部。二者的區(qū)別在于是否有組裝過程,組裝過程發(fā)生的位置。這兩個設(shè)計模式可以連起來用,客戶端通過調(diào)用一個建造角色,間接調(diào)用另一個抽象工廠模式的工廠角色。工廠模式返還不同產(chǎn)品族的零件,而建造者模式則把它們組裝起來。

策略模式(strategy模式):建造者模式在結(jié)構(gòu)上很接近于策略模式,事實上建造者模式是策略模式的一種特殊情況。二者的區(qū)別在于用意不同。建造者模式作用于客戶端一點一點的建造新的對象,而策略模式的目的是為算法提供抽象的接口。

建造者模式與模板方法模式:建造者模式在退化、失去導(dǎo)演者角色后,可以發(fā)展到模板方法模式(即將建造過程的算法實現(xiàn)放在建造角色中)。

建造者模式與合成模式:合成模式描述一個對象樹的組成結(jié)構(gòu),而建造者模式則可以用來描述對象樹的生成過程。
以上4點來自《Java與模式》
六、Builder模式PHP示例

<?php
/**
 * 產(chǎn)品
 * 此處僅以一個產(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();
?>

關(guān)于怎么在php項目中實現(xiàn)一個建造者模式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI