定義
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。
結構中包含的角色
- Builder(抽象建造者)
- ConcreteBuilder(具體建造者)
- Product(產(chǎn)品角色)
- Director(指揮者)
一句話概括設計模式
通過分解構建步驟,控制構建順序,隔離復雜對象的創(chuàng)建和使用的方式,解決復雜對象的構建問題。
最小可表達代碼
// 需要構建的產(chǎn)品
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->buildLanguage();
return $builder->makeProduct();
}
}
設計的原則和思想
控制對象創(chuàng)建的過程。
優(yōu)點
- 將復雜產(chǎn)品的創(chuàng)建步驟分解在不同方法中,使得創(chuàng)建過程更加清晰,方便控制。
- 具體建造者間相互獨立,若想增減時無須修改其他代碼。
缺點
- 創(chuàng)建的產(chǎn)品必須有共同點,范圍有限制。
- 產(chǎn)品的內(nèi)部變化復雜,會導致需要定義很多具體建造者類來實現(xiàn)這種變化,導致系統(tǒng)變得很龐大
何時使用
- 生成的對象具有復雜的內(nèi)部結構。
- 需要生成的產(chǎn)品對象的屬性相互依賴,需要指定其生成順序。
- 對象的創(chuàng)建過程獨立于創(chuàng)建該對象的類。在建造者模式中通過引入了指揮者類,將創(chuàng)建過程封裝在指揮者類中,而不在建造者類和客戶類中。
實際應用場景
- JAVA 中的 StringBuilder。
- 商城的商品,收藏的商品,瀏覽過的商品,推薦的商品。可以使用建造者模式構建商品創(chuàng)建的過程。