定義:
建造者模式(Builder):將一個復雜物件的構建與它的表示分離,使得同樣的構建程序可以創建不同的表示,
結構:
- Builder:抽象建造者類,為創建一個 Product 物件的各個部件指定的抽象介面,
- Director:指揮者類,構建一個使用 Builder 介面的物件
- ConcreteBuilder:具體建造者類,實作 Builder 介面,構造和裝配各個部件,
- Product:產品類,由多個部件組成,
- Client:客戶端代碼,
代碼實體:
/** * 產品類,定義產品各部件 * Class Product */ class Product { /** * 名稱 */ public $name; /** * 尺寸 */ public $size; /** * 顏色 */ public $colour; /** * 產品展示 */ public function show() { echo "產品名稱:{$this->name}<br/>產品尺寸:{$this->size}<br/>產品顏色:{$this->colour}"; } } /** * 抽象建造者類,定義產品各部件的抽象方法 */ abstract class Builder { public $product; public function __construct() { $this->product = new Product(); } abstract public function name(); abstract public function size(); abstract public function colour(); abstract public function getProduct(); } /** * 具體建造者類A * Class ConcreteBuilderA */ class ConcreteBuilderA extends Builder { public function name() { // TODO: Implement name() method. $this->product->name = '產品A'; } public function size() { // TODO: Implement size() method. $this->product->size = '20'; } public function colour() { // TODO: Implement colour() method. $this->product->colour = '白色'; } public function getProduct() { // TODO: Implement getProduct() method. return $this->product; } } /** * 具體建造者類B * Class ConcreteBuilderB */ class ConcreteBuilderB extends Builder { public function name() { // TODO: Implement name() method. $this->product->name = '產品B'; } public function size() { // TODO: Implement size() method. $this->product->size = '30'; } public function colour() { // TODO: Implement colour() method. $this->product->colour = '黑色'; } public function getProduct() { // TODO: Implement getProduct() method. return $this->product; } } /** * 指揮者 * Class Director */ class Director { /** * 指揮構造程序 * @param Builder $builder */ public function construct(Builder $builder) { $builder->name(); $builder->size(); $builder->colour(); return $builder->getProduct(); } } // 客戶端呼叫 // 指揮者 $director = new Director(); // 產品A建造 $productA = new ConcreteBuilderA(); $directorA = $director->construct($productA); $directorA->show(); echo "<br/>--------------------------------<br/>"; // 產品B建造 $productB = new ConcreteBuilderB(); $directorB = $director->construct($productB); $directorB->show(); // 結果 產品名稱:產品A 產品尺寸:20 產品顏色:白色 -------------------------------- 產品名稱:產品B 產品尺寸:30 產品顏色:黑色
總結:
- 建造者模式可以將一個產品的內部表象與產品的生成程序分割開來,從而可以使一個建造程序生成具有不同的內部表象的產品物件,
- 使用建造者模式,用戶就只需要指定需要建造的型別就可以得到它們,而建造的具體程序和細節可以不用知道,
- 建造者模式的好處就是使得建造代碼與表示代碼分離,由于建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了,
- 建造者模式是在當創建復雜物件的演算法應該獨立于該物件的組成部分以及它們的裝配方式時適用的模式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274999.html
標籤:設計模式
下一篇:PHP設計模式—建造者模式
