跟著執行個體學習設計模式-產生器模式(builder)

來源:互聯網
上載者:User

標籤:設計模式   產生器   抽象工廠   

產生器模式是建立型設計模式。

設計意圖:將一個複雜的類表示與其構造相分離,使得相同的構建過程能夠得出不同的表示。

執行個體類圖:


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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.