定義
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
結構中包含的角色
- Builder(抽象建造者)
- ConcreteBuilder(具體建造者)
- Product(產品角色)
- Director(指揮者)
一句話概括設計模式
透過分解構建步驟,控制構建順序,隔離複雜物件的建立和使用的方式,解決複雜物件的構建問題。
最小可表達程式碼
// 需要構建的產品
class WebProduct
{
private $language;
public function setLanguage(String $language)
{
$this->language = $language;
}
}
// 抽象構建者
abstract class BaseBuilder
{
protected $webProduct;
public function __construct()
{
$this->webProduct = new WebProduct();
}
public abstract function buildLanguage();
public function makeProduct()
{
return $this->webProduct;
}
}
// 具體構建者
class PHPBuilder extends BaseBuilder
{
public function buildLanguage()
{
$this->webProduct->setLanguage(‘php’);
}
}
// 指揮者
class WebDirector
{
public function make(BaseBuilder $builder)
{
$builder->buildLanguage();
return $builder->makeProduct();
}
}
設計的原則和思想
控制物件建立的過程。
優點
- 將複雜產品的建立步驟分解在不同方法中,使得建立過程更加清晰,方便控制。
- 具體建造者間相互獨立,若想增減時無須修改其他程式碼。
缺點
- 建立的產品必須有共同點,範圍有限制。
- 產品的內部變化複雜,會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大
何時使用
- 生成的物件具有複雜的內部結構。
- 需要生成的產品物件的屬性相互依賴,需要指定其生成順序。
- 物件的建立過程獨立於建立該物件的類。在建造者模式中透過引入了指揮者類,將建立過程封裝在指揮者類中,而不在建造者類和客戶類中。
實際應用場景
- JAVA 中的 StringBuilder。
- 商城的商品,收藏的商品,瀏覽過的商品,推薦的商品。可以使用建造者模式構建商品建立的過程。
本作品採用《CC 協議》,轉載必須註明作者和本文連結