首頁 >後端開發 >php教程 >詳解PHP設計模式之建造者模式

詳解PHP設計模式之建造者模式

*文
*文原創
2018-01-05 17:51:342388瀏覽

本文主要介紹了php設計模式中的建造者模式,使用php實現建造者模式,有興趣的小夥伴可以參考一下。希望對大家有幫助。

建造者模式可以讓一個產品的內部表象和和產品的生產過程分離開,從而可以產生具有不同內部表象的產品。
一、Builder模式結構圖

 

二、Builder模式中主要角色
抽象建造者(Builder)角色:定義一個抽象接口,規範產品各個組成成分的建造(即規範具體建造者的方法實現)。其中所規範的方法中必須包括建造方法和結果返回方法
具體建造者(ConcreteBuilder)角色:實作抽象建造者角色所定義的方法。具體建造者與業務邏輯關聯性較大,應用程式最終會透過呼叫此角色中所實現的建造方法按照業務邏輯建立產品,在建造完成後透過結果返回方法傳回建造的產品實例。一般在外部由客戶或一個抽象工廠創建。
導演者(Director)角色:此角色的作用是呼叫特定的建造者角色來建造產品。導演者與產品類別沒有直接關係,與產品類別交談的是具體抽象角色。
產品(Product)角色:在指導者的指導下由建造者所創建的那個複雜的物件
導演者角色與客戶端直接打交道,它理解客戶端的業務邏輯,將客戶端建立產品的請求拆分成對產品組成部分的請求,然後呼叫特定產品角色執行建造操作。它分離了客戶端與具體建造者。
三、Builder模式的優缺點
Builder模式的優點: 建造者模式可以很好的將一個物件的實現與相關的「業務」邏輯分離開來,從而可以在不改變事件邏輯的前提下,使增加(或改變)實現變得非常容易。
Builder模式的缺點: 建造者介面的修改會導致所有執行類別的修改。
四、Builder模式的使用場景與效果
以下情況應使用建造者模式:
1、 需要產生的產品物件有複雜的內部結構。
2、 需要產生的產品物件的屬性相互依賴,建造者模式可以強迫生成順序。
3、 在對象創建過程中會使用到系統中的一些其它對象,這些對像在產品對象的創建過程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產品內部組成的細節。
2、 每一個Builder相對獨立,而與其它的Builder無關。
3、 模式所建造的最終產品更容易控制。
五、Builder模式與其它模式
抽象工廠模式(abstract factory模式):在抽象工廠模式中,每一次工廠對象被呼叫時都會返還一個完整的產品對象,而客戶端可能會將這些產品組裝成一個更大更複雜的產品,也可能不會。建造者模式則不同,它一點一點地建造出一個複雜的產品,而這個產品的組裝過程發生在建造者內部。二者的差別在於是否有組裝過程,組裝過程發生的位置。這兩個設計模式可以連起來用,客戶端透過呼叫一個建造角色,間接地呼叫另一個抽象工廠模式的工廠角色。工廠模式返還不同產品族的零件,而建造者模式則把它們組裝起來。

策略模式(strategy模式):建造者模式在結構上很接近策略模式,事實上建造者模式是策略模式的一種特殊情況。二者的差別在於用意不同。建造者模式作用於客戶端一點一點的建造新的對象,而策略模式的目的是為演算法提供抽象的介面。

建造者模式與模板方法模式:建造者模式在退化、失去導演者角色後,可以發展到模板方法模式(即將建造過程的演算法實現放在建造角色中)。

建造者模式與合成模式:合成模式描述一個物件樹的組成結構,而建造者模式則可以用來描述物件樹的生成過程。
以上4點來自《Java與模式》
六、Builder模式PHP範例

#
<?php
/**
 * 产品
 * 此处仅以一个产品类中的字符串演示产品
 */
class Product {                          
 /**
 * 产品的组成部分集合
 */
 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(&#39;printf&#39;, $this->_parts);
 }
}
 
/**
 * 抽象建造者 
 */
abstract class Builder {
 
 /**
 * 产品零件构造方法1
 */
 public abstract function buildPart1();
 
 
 /**
 * 产品零件构造方法2
 */
 public abstract function buildPart2();
 
 
 /**
 * 产品返还方法
 */
 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;
 }
}
 
/**
 * 导演者
 */
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設計模式之適配器模式詳解#

PHP設計模式之迭代器模式詳解

#PHP設計模式之裝飾器模式詳解

以上是詳解PHP設計模式之建造者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn