《PHP實戰(zhàn):學習php設計模式 php實現(xiàn)建造者模式》要點:
本文介紹了PHP實戰(zhàn):學習php設計模式 php實現(xiàn)建造者模式,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP實戰(zhàn)建造者模式可以讓一個產(chǎn)品的內部表象和和產(chǎn)品的生產(chǎn)過程分離開,從而可以生成具有不同內部表象的產(chǎn)品.
一、Builder模式結構圖
PHP實戰(zhàn)?
PHP實戰(zhàn)二、Builder模式中主要角色
抽象建造者(Builder)角色:定義一個抽象接口,規(guī)范產(chǎn)品各個組成成分的建造(即規(guī)范具體建造者的方法實現(xiàn)).其中所規(guī)范的方法中必須包括建造方法和結果返回方法
具體建造者(ConcreteBuilder)角色:實現(xiàn)抽象建造者角色所定義的方法.具體建造者與業(yè)務邏輯關聯(lián)性較大,應用程序最終會通過調用此角色中所實現(xiàn)的建造方法按照業(yè)務邏輯創(chuàng)建產(chǎn)品,在建造完成后通過結果返回方法返回建造的產(chǎn)品實例.一般在外部由客戶或一個抽象工廠創(chuàng)建.
導演者(Director)角色:此角色的作用是調用具體的建造者角色建造產(chǎn)品.導演者與產(chǎn)品類沒有直接關系,與產(chǎn)品類交談的是具體抽象角色.
產(chǎn)品(Product)角色:在指導者的指導下由建造者所創(chuàng)建的那個復雜的對象
導演者角色與客戶端直接打交道,它理解客戶端的業(yè)務邏輯,將客戶端創(chuàng)建產(chǎn)品的哀求拆分成對產(chǎn)品組成部分的哀求,然后調用具體產(chǎn)品角色執(zhí)行建造操作.它分離了客戶端與具體建造者.
三、Builder模式的優(yōu)缺點
Builder模式的優(yōu)點: 建造者模式可以很好的將一個對象的實現(xiàn)與相關的“業(yè)務”邏輯分離開來,從而可以在不改變事件邏輯的前提下,使增加(或改變)實現(xiàn)變得非常容易.
Builder模式的缺點: 建造者接口的修改會導致所有執(zhí)行類的修改.
四、Builder模式的使用場景與效果
以下情況應當使用建造者模式:
1、 需要生成的產(chǎn)品對象有復雜的內部結構.
2、 需要生成的產(chǎn)品對象的屬性相互依賴,建造者模式可以強迫生成順序.
3、 在對象創(chuàng)建過程中會使用到系統(tǒng)中的一些其它對象,這些對象在產(chǎn)品對象的創(chuàng)建過程中不易得到.
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得產(chǎn)品的內部表象可以獨立的變化.使用建造者模式可以使客戶端不必知道產(chǎn)品內部組成的細節(jié).
2、 每一個Builder都相對獨立,而與其它的Builder無關.
3、 模式所建造的最終產(chǎn)品更易于控制.
五、Builder模式與其它模式
抽象工廠模式(abstract factory模式):在抽象工廠模式中,每一次工廠對象被調用時都會返還一個完整的產(chǎn)品對象,而客戶端可能會將這些產(chǎn)品組裝成一個更大更復雜的產(chǎn)品,也可能不會.建造者模式則不同,它一點一點地建造出一個復雜的產(chǎn)品,而這個產(chǎn)品的組裝過程發(fā)生在建造者內部.二者的區(qū)別在于是否有組裝過程,組裝過程發(fā)生的位置.這兩個設計模式可以連起來用,客戶端通過調用一個建造角色,間接調用另一個抽象工廠模式的工廠角色.工廠模式返還不同產(chǎn)品族的零件,而建造者模式則把它們組裝起來.
PHP實戰(zhàn)策略模式(strategy模式):建造者模式在結構上很接近于策略模式,事實上建造者模式是策略模式的一種特殊情況.二者的區(qū)別在于用意不同.建造者模式作用于客戶端一點一點的建造新的對象,而策略模式的目的是為算法提供抽象的接口.
PHP實戰(zhàn)建造者模式與模板辦法模式:建造者模式在退化、失去導演者角色后,可以發(fā)展到模板辦法模式(即將建造過程的算法實現(xiàn)放在建造角色中).
PHP實戰(zhàn)建造者模式與合成模式:合成模式描述一個對象樹的組成結構,而建造者模式則可以用來描述對象樹的生成過程.
以上4點來自《Java與模式》
六、Builder模式PHP示例
PHP實戰(zhàn)
<?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)品零件構造辦法1
*/
public abstract function buildPart1();
/**
* 產(chǎn)品零件構造辦法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;
}
}
/**
* 導演者
*/
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實戰(zhàn)以上就是使用php實現(xiàn)建造者模式的代碼,還有一些關于建造者模式的概念區(qū)分,希望對大家的學習有所幫助.
歡迎參與《PHP實戰(zhàn):學習php設計模式 php實現(xiàn)建造者模式》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8309.html