生成器模式是建立型設計模式。html
設計意圖:將一個複雜的類表示與其構造相分離,使得一樣的構建過程能夠得出不一樣的表示。設計模式
實例類圖:ide
IVehicleBuilder:抽象建造者。爲建立一個Vehicle對象並建立它的相關部件指定的抽象接口,把產品的生產過程分解爲不一樣的步驟,從而使詳細的建造者在詳細的建造步驟上具備不少其它彈性,從而創造出不一樣表示的產品。(這裏就是小車和卡車)ui
CarBuilder、TrunkBuilder:詳細建造者,實現IVehicleBuilder接口,構造和裝配產品的各個部件定義並明白它所建立的表示,提供一個返回這個產品的接口。spa
Director:指揮者,構建一個使用IVehicleBuilder接口的對象。設計
Vehicle:汽車產品,被構建的複雜對象,詳細產品建造者,建立該產品的內部表示並定義它的裝配過程。code
咱們先看一下Director都作了什麼!htm
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; } } 對象
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 { @Override public Engine builderEngine() { // TODO Auto-generated method stub return null; } @Override public Tank builderTank() { // TODO Auto-generated method stub return null; } @Override public Vehicle builderVehicle(Engine engine,Tank tank) { // TODO Auto-generated method stub return 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 { @Override public Engine builderEngine() { // TODO Auto-generated method stub return null; } @Override public Tank builderTank() { // TODO Auto-generated method stub return null; } @Override public Vehicle builderVehicle(Engine engine,Tank tank) { // TODO Auto-generated method stub return null; } }