在軟件開發過程中有時需要創建一個復雜的對象,這個復雜對象通常由多個子部件按一定的步驟組合而成。例如,計算機是由 CPU、主板、內存、硬盤、顯卡、機箱、顯示器、鍵盤、鼠標等部件組裝而成的,采購員不可能自己去組裝計算機,而是將計算機的配置要求告訴計算機銷售公司,計算機銷售公司安排技術人員去組裝計算機,然后再交給要買計算機的采購員。
生活中這樣的例子很多,如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;每封電子郵件的發件人、收件人、主題、內容、附件等內容也各不相同。
以上所有這些產品都是由多個部件構成的,各個部件可以靈活選擇,但其創建步驟都大同小異。這類產品的創建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產品的創建。
## 模式的定義與特點
建造者(Builder)模式的定義:指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式。它是將一個復雜的對象分解為多個簡單的對象,然后一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。
該模式的主要優點如下:
1. 封裝性好,構建和表示分離。
2. 擴展性好,各個具體的建造者相互獨立,有利于系統的解耦。
3. 客戶端不必知道產品內部組成的細節,建造者可以對創建過程逐步細化,而不對其它模塊產生任何影響,便于控制細節風險。
其缺點如下:
1. 產品的組成部分必須相同,這限制了其使用范圍。
2. 如果產品的內部變化復雜,如果產品內部發生變化,則建造者也要同步修改,后期維護成本較大。
**建造者(Builder)模式和工廠模式的關注點不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創建過程,但兩者可以結合使用。**
## 模式的結構與實現
建造者(Builder)模式由產品、抽象建造者、具體建造者、指揮者等 4 個要素構成,現在我們來分析其基本結構和實現方法。
#### 1\. 模式的結構
建造者(Builder)模式的主要角色如下。
1. 產品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創建其各個零部件。
2. 抽象建造者(Builder):它是一個包含創建產品各個子部件的抽象方法的接口,通常還包含一個返回復雜產品的方法 getResult()。
3. 具體建造者(Concrete Builder):實現 Builder 接口,完成復雜產品的各個部件的具體創建方法。
4. 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成復雜對象的創建,在指揮者中不涉及具體產品的信息
```
<?php
//產品,圓形, 產生這個對象需要多個set
class Circle {
private $color;
private $radius;
public function setColor($color){
$this->color = $color;
}
public function setRadius($radius){
$this->radius = $radius;
}
}
```
```
<?php
//抽象建造者
abstract class Builder {
//創建產品對象
protected product = new Circle();
public abstract setColor();
public abstract setRadius();
//返回產品對象
public getResult() {
return product;
}
}
```
```
<?php
//具體的建造者
class ConcreteBuilder extends Builder {
public setColor() {
$this->product->setColor("red");
}
public setRadius() {
$this->product->setRadius(100);
}
}
```
```
//指揮者
class Director {
private $builder;
public function Director(Builder $builder) {
$this->builder = $builder;
}
//產品構建與組裝方法
public Product construct() {
$this->builder->setColor();
$this->builder->setRadius();
return $this->builder->getResult();
}
}
```
```
//client
<?php
public class Client {
public static test() {
$builder = new ConcreteBuilder();
$director = new Director($builder);
$product = $director->construct();
product->show();
}
}
```
- 序言
- 從業感悟
- 常用名詞
- HTML
- JS
- ES6新特性
- jquery和vue對比
- 徹底理解this
- JQuery添加自定義函數
- js的實現
- 原始值和引用值
- MYSQL
- 簡介
- 術語
- 特點
- 范式
- 數據類型1
- 數據類型2
- 編碼
- 權限管理
- 事務
- mvvc
- 引擎
- MyISAM與InnoDB區別
- 索引類型
- 鎖
- 死鎖
- 分層架構
- 執行計劃
- join原理
- 高可用
- 日志類型
- 分庫分表
- 中間件
- 服務器
- 操作系統
- 信號量 鎖 隊列
- PHP
- composer加載原理
- composer基礎知識
- 自動加載函數
- composer加載代碼
- composer 自動加載
- 內存管理
- PHP執行流程
- cgi,fastCgi,php-fpm
- HTTP
- 錯誤碼
- 跨域請求
- 面試
- 安全
- HTTP劫持
- 設計模式
- 如何正確的使用設計模式
- 單例模式
- 原型模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 建造者模式
- 設計原則
- 算法
- PHP短標簽