標籤:設計模式 產生器 抽象工廠
產生器模式是建立型設計模式。
設計意圖:將一個複雜的類表示與其構造相分離,使得相同的構建過程能夠得出不同的表示。
執行個體類圖:
IVehicleBuilder:抽象建造者,為建立一個Vehicle對象並建立它的相關組件指定的抽象介面,把產品的生產過程分解為不同的步驟,從而使具體的建造者在具體的建造步驟上具有更多彈性,從而創造出不同表示的產品。(這裡就是小車和卡車)
CarBuilder、TrunkBuilder:具體建造者,實現IVehicleBuilder介面,構造和裝配產品的各個組件定義並明確它所建立的表示,提供一個返回這個產品的介面。
Director:指揮者,構建一個使用IVehicleBuilder介面的對象。
Vehicle:汽車產品,被構建的複雜物件,具體產品建造者,建立該產品的內部表示並定義它的裝配過程。
我們先看一下Director都做了什麼!
package com.builder;import com.factory.abstrcatfactory.model.Engine;import com.factory.abstrcatfactory.model.Tank;import com.factory.abstrcatfactory.model.Vehicle;/**構建器的指揮者 * 構建器模式可以構建相同步驟的兩個系列商品 * 在構建相同步驟的系列商品上,代碼量上要優於抽象原廠模式,但是每個產品的不同步驟產品的增加時抽象工廠更有優勢,因為功能類隔離性更好。 * @author gaoxu * 實踐出真知! */public class Director {private IVehicleBuilder _vehicleBuilder = null;public Director(IVehicleBuilder vehicleBuilder){_vehicleBuilder = vehicleBuilder;}public Vehicle createVehicle(){Engine engine = _vehicleBuilder.builderEngine();Tank tank = _vehicleBuilder.builderTank();Vehicle vehicle = _vehicleBuilder.builderVehicle(engine,tank);return vehicle;}}
我們看到指揮者負責指揮建造產品,再來看一下client的代碼,我們就清楚指揮者有多重要了,產生器模式必須有指揮者。
package com.builder;import com.factory.abstrcatfactory.model.Vehicle;/** * @author gaoxu * 實踐出真知! */public class Client {public static void main(String[] para){//小車IVehicleBuilder carBuilder = new CarBuilder();Director director = new Director(carBuilder);Vehicle car = director.createVehicle();//卡車IVehicleBuilder trunkBuilder = new TrunkBuilder();Director directorT = new Director(trunkBuilder);Vehicle trunk = directorT.createVehicle();}}
我們再來看具體構建者的代碼,我們就清楚了,每個具體構建器都是一個產品的構建整體過程的具體實現。
小車具體構建者,構建發動機、構建油箱,構建小車。這些都封裝在具體的構建器中,這樣構建與表示就顯示的分離,顯示在client端沒有任何具體構建者內容的影子,完全封裝了起來。
package com.builder;import com.factory.abstrcatfactory.model.Engine;import com.factory.abstrcatfactory.model.Tank;import com.factory.abstrcatfactory.model.Vehicle;/**小車具體實作類別 * @author gaoxu * 實踐出真知! */public class CarBuilder implements IVehicleBuilder {@Overridepublic Engine builderEngine() {// TODO Auto-generated method stubreturn null;}@Overridepublic Tank builderTank() {// TODO Auto-generated method stubreturn null;}@Overridepublic Vehicle builderVehicle(Engine engine,Tank tank) {// TODO Auto-generated method stubreturn null;}}
package com.builder;import com.factory.abstrcatfactory.model.Engine;import com.factory.abstrcatfactory.model.Tank;import com.factory.abstrcatfactory.model.Vehicle;/**卡車具體實作類別 * @author gaoxu * 實踐出真知! */public class TrunkBuilder implements IVehicleBuilder {@Overridepublic Engine builderEngine() {// TODO Auto-generated method stubreturn null;}@Overridepublic Tank builderTank() {// TODO Auto-generated method stubreturn null;}@Overridepublic Vehicle builderVehicle(Engine engine,Tank tank) {// TODO Auto-generated method stubreturn null;}}
上邊的執行個體也是建立汽車,我們可以看到同樣是建立汽車,產生器模式要比抽象原廠模式的代碼量少很多很多,當然在解耦方面還是抽象工廠更好一些,因為產生器中的具體構建器中有所有的產品組件的構建過程,如果這個過程更複雜那麼具體構建器將非常龐大,修改起來錯誤率也會很高,而抽象工廠在這方面還是比較好的,每個組件都是獨立的構建介面與類。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
跟著執行個體學習設計模式-產生器模式(builder)