跟着實例學習設計模式(6)-生成器模式builder(建立型)

生成器模式是建立型設計模式。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; } } 對象


咱們看到指揮者負責指揮建造產品,再來看一下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 {

	@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; } }

上邊的實例也是建立汽車。咱們可以看到相同是建立汽車,生成器模式要比抽象工廠模式的代碼量少很是多很是多,固然在解耦方面仍是抽象工廠更好一些,因爲生成器中的詳細構建器中有所有的產品部件的構建過程。假設這個過程更復雜那麼詳細構建器將很是龐大,改動起來錯誤率也會很是高。而抽象工廠在這方面仍是比較好的,每個部件都是獨立的構建接口與類。
相關文章
相關標籤/搜索