定義
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示吱晒。
結(jié)構(gòu)中包含的角色
- Builder(抽象建造者)
- ConcreteBuilder(具體建造者)
- Product(產(chǎn)品角色)
- Director(指揮者)
一句話概括設(shè)計(jì)模式
通過分解構(gòu)建步驟针肥,控制構(gòu)建順序俺泣,隔離復(fù)雜對(duì)象的創(chuàng)建和使用的方式灭返,解決復(fù)雜對(duì)象的構(gòu)建問題术吝。
最小可表達(dá)代碼
// 需要構(gòu)建的產(chǎn)品
class WebProduct
{
private $language;
public function setLanguage(String $language)
{
$this->language = $language;
}
}
// 抽象構(gòu)建者
abstract class BaseBuilder
{
protected $webProduct;
public function __construct()
{
$this->webProduct = new WebProduct();
}
public abstract function buildLanguage();
public function makeProduct()
{
return $this->webProduct;
}
}
// 具體構(gòu)建者
class PHPBuilder extends BaseBuilder
{
public function buildLanguage()
{
$this->webProduct->setLanguage('php');
}
}
// 指揮者
class WebDirector
{
public function make(BaseBuilder builder->buildLanguage();
return $builder->makeProduct();
}
}
設(shè)計(jì)的原則和思想
控制對(duì)象創(chuàng)建的過程转捕。
優(yōu)點(diǎn)
- 將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同方法中园细,使得創(chuàng)建過程更加清晰,方便控制苫拍。
- 具體建造者間相互獨(dú)立芜繁,若想增減時(shí)無須修改其他代碼。
缺點(diǎn)
- 創(chuàng)建的產(chǎn)品必須有共同點(diǎn)绒极,范圍有限制。
- 產(chǎn)品的內(nèi)部變化復(fù)雜蔬捷,會(huì)導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化垄提,導(dǎo)致系統(tǒng)變得很龐大
何時(shí)使用
- 生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
- 需要生成的產(chǎn)品對(duì)象的屬性相互依賴周拐,需要指定其生成順序铡俐。
- 對(duì)象的創(chuàng)建過程獨(dú)立于創(chuàng)建該對(duì)象的類。在建造者模式中通過引入了指揮者類妥粟,將創(chuàng)建過程封裝在指揮者類中审丘,而不在建造者類和客戶類中。
實(shí)際應(yīng)用場(chǎng)景
- JAVA 中的 StringBuilder勾给。
- 商城的商品滩报,收藏的商品锅知,瀏覽過的商品,推薦的商品脓钾∈鄱茫可以使用建造者模式構(gòu)建商品創(chuàng)建的過程。