生成器模式又叫作建造者模式,以前介紹的一些建立型的設計模式基本都比較簡單的,生成器模式是較爲複雜的建立型模式,它將客戶端與包含多個組成部分的複雜對象的建立過程分離,客戶端無須知道複雜對象的內部組成部分與裝配方式,只須要知道所需建造者的類型便可。算法
它關注如何一步一步建立一個的複雜對象,不一樣的具體建造者定義了不一樣的建立過程,且具體建造者相互獨立,增長新的建造者很是方便,無須修改已有代碼,系統具備較好的拓展性。編程
什麼是生成器模式
生成器模式:是一種設計模式,又名:建造模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。 —— 節選自維基百科設計模式
例如,咱們來思考如何建立一輛汽車對象。創造一輛簡單的汽車,首先須要建立車的框架和車軲轆,而後安裝汽車門、汽車玻璃,最後再安裝上發動機。可是若是你想要一個性能更好的汽車的話,那麼還須要給汽車加上一些其餘的設施,這個時候我們須要怎麼去作呢?數組
最簡單的方法是拓展原有汽車的基類,而後建立一系列涵蓋全部參數組合的子類。但最終將面對至關數量的子類。任何新增的參數都會讓這個層次結構更加複雜。框架
另外一種方法則無需生成子類。能夠再汽車的基類中建立一個包括全部可能參數的超級構造函數,並用它來控制汽車對象。這種方法能夠避免生成子類,但它卻會形成另一個問題。一般狀況下,絕大部分的參數都沒有使用,這使得對於構造函數的調用十分不簡潔。函數
生成器模式優缺點
生成器模式會將對象構造過程劃分爲一組步驟,每次建立對象時,你都須要經過生成器對象執行一系列步驟。 重點在於你無需調用全部步驟,而只需調用建立特定對象配置所需的那些步驟便可。當你須要建立不一樣形式的產品時,其中的一些構造步驟可能須要不一樣的實現。能夠建立多個不一樣的生成器, 用不一樣方式實現一組相同的建立步驟。 而後你就能夠在建立過程當中使用這些生成器 (例如按順序調用多個構造步驟) 來生成不一樣類型的對象。性能
優勢
開閉原則
缺點
示例
生成器模式的主要角色以下:ui
類圖以下所示:this
代碼示例: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
來構建對象,但這並非說生成器主要就是用來實現分步驟構建對象的。生成器模式的重心仍是在於分離總體構建算法和部件構造,而分步驟構建對象不過是總體構建算法的一個簡單表現,或者說是一個附帶產物。