設計模式之生成器模式

生成器模式又叫作建造者模式,以前介紹的一些建立型的設計模式基本都比較簡單的,生成器模式是較爲複雜的建立型模式,它將客戶端與包含多個組成部分的複雜對象的建立過程分離,客戶端無須知道複雜對象的內部組成部分與裝配方式,只須要知道所需建造者的類型便可。算法

它關注如何一步一步建立一個的複雜對象,不一樣的具體建造者定義了不一樣的建立過程,且具體建造者相互獨立,增長新的建造者很是方便,無須修改已有代碼,系統具備較好的拓展性。編程

什麼是生成器模式

生成器模式:是一種設計模式,又名:建造模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。 —— 節選自維基百科設計模式

例如,咱們來思考如何建立一輛汽車對象。創造一輛簡單的汽車,首先須要建立車的框架和車軲轆,而後安裝汽車門、汽車玻璃,最後再安裝上發動機。可是若是你想要一個性能更好的汽車的話,那麼還須要給汽車加上一些其餘的設施,這個時候我們須要怎麼去作呢?數組

最簡單的方法是拓展原有汽車的基類,而後建立一系列涵蓋全部參數組合的子類。但最終將面對至關數量的子類。任何新增的參數都會讓這個層次結構更加複雜。框架

另外一種方法則無需生成子類。能夠再汽車的基類中建立一個包括全部可能參數的超級構造函數,並用它來控制汽車對象。這種方法能夠避免生成子類,但它卻會形成另一個問題。一般狀況下,絕大部分的參數都沒有使用,這使得對於構造函數的調用十分不簡潔。函數

生成器模式優缺點

生成器模式會將對象構造過程劃分爲一組步驟,每次建立對象時,你都須要經過生成器對象執行一系列步驟。 重點在於你無需調用全部步驟,而只需調用建立特定對象配置所需的那些步驟便可。當你須要建立不一樣形式的產品時,其中的一些構造步驟可能須要不一樣的實現。能夠建立多個不一樣的生成器, 用不一樣方式實現一組相同的建立步驟。 而後你就能夠在建立過程當中使用這些生成器 (例如按順序調用多個構造步驟) 來生成不一樣類型的對象。性能

優勢
  1. 在生成器模式中,客戶端沒必要知道產品內部組成的細節,將產品自己與產品的建立過程解耦,使得相同的建立過程能夠建立不一樣的產品對象。
  2. 每個具體建造者都相對獨立,而與其餘的具體建造者無關,所以能夠很方便地替換具體建造者或增長新的具體建造者,用戶使用不一樣的具體建造者便可獲得不一樣的產品對象。因爲指揮者類針對抽象建造者編程,增長新的具體建造者無須修改原有類庫的代碼,系統擴展方便,符合開閉原則
  3. 能夠更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,也更方便使用程序來控制建立過程。
缺點
  1. 生成器模式所生成的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,例如不少組成部分都不相同,不適合使用建造者模式,所以其使用範圍受到必定的限制
  2. 若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大,增長系統的理解難度和運行成本

示例

生成器模式的主要角色以下:ui

  1. 生成器:接口生命再全部類型生成器中通用的產品構造步驟
  2. 具體生成器:提供構造過程的不一樣實現。具體生成器也能夠構造不遵循通用接口的產品
  3. 產品:是最終生成的對象。由不一樣生成器構造的產品無需屬於同一類層次構造或接口
  4. 指揮者:定義調用構造步驟的順序,這樣你就能夠建立和服用特定的產品配置
  5. 客戶端:必須將某個生成器對象與主管類關聯,通常狀況下,你只須要經過指揮者類構造函數的參數進行一次性關聯便可

類圖以下所示:this

image

代碼示例:spa

// 抽象建造者
abstract class Builder {
    public abstract buildPartA():void;
    public abstract buildPartB():void;
    public abstract buildPartC():void;
    public abstract buildProduct():Product;
}

// 具體建造者
class ConcreteBuilder extends Builder {
    private product:Product;
    constructor(product:Product) {
        super();
        this.product = product;
    }

    public buildPartA():void {}
    public buildPartB():void {}
    public buildPartC():void {}

    // 最終組建一個產品
    public buildProduct():Product {
        return this.product;
    }
}

// 產品角色
class Product {
    public doSomething():void {
        // 獨立業務
    }
}

// 指揮者
class Director {
    private _builder:Builder;
    constructor(builder:Builder) {
        this._builder = builder;
    }

    set builder(builder:Builder) {
        this._builder = builder;
    }

    // 將處理建造的流程交給指揮者
    public constructorProduct() {
        this._builder.buildPartA();
        this._builder.buildPartB();
        this._builder.buildPartC();
        return this._builder.buildProduct();
    }
}

// 使用
const builder:Builder = new ConcreteBuilder(new Product());
const director:Director = new Director(builder);
const product:Product = director.constructorProduct();

總結

生成器模式的主要功能是構建複雜的產品,並且是細化的,分步驟的構建產品,也就是生成器模式重在一步一步解決構造複雜對象的問題。若是僅僅這麼認知生成器模式的功能是不夠的。更爲重要的是,這個構建的過程是統一的、固定不變的,變化的部分放到生成器部分了,只要配置不一樣的生成器,那麼一樣的構建過程,就能構建出不一樣的產品來。

雖然在生成器模式的總體構建算法中,會一步一步引導Builder來構建對象,但這並非說生成器主要就是用來實現分步驟構建對象的。生成器模式的重心仍是在於分離總體構建算法和部件構造,而分步驟構建對象不過是總體構建算法的一個簡單表現,或者說是一個附帶產物。

相關文章
相關標籤/搜索