1. 程式人生 > >設計模式(五)——建造者模式

設計模式(五)——建造者模式

1. 定義

建造者模式是將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

在使用者不知道物件的建造過程和細節的情況下就可以直接建立複雜的物件。

2. 建造者模式通常包括下面幾個角色:

(1)Builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。

(2)ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。

(3)Director:呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。

(4)Product:要建立的複雜物件。

3. 建造者模式具體實現

下面以建造一輛車的過程來舉例說明建造者模式的過程:

(1)定義要構建的具體物件Car

public class Car{
    //輪子
	private String wheel;
    //車身
	private String body;
    //發動機
	private String engine;

	public String getWheel() {
		return wheel;
	}
	public void setWheel(String wheel) {
		this.wheel= wheel;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getEngine() {
		return engine;
	}
	public void setEngine(String engine) {
		this.engine = engine;
	}
}

(2)接下來我們定義一個建造汽車的標準介面

public interface IBuildCar {
	public void buildWheel();
	public void buildBody();
	public void buildEngine();
	public Car createCar();
}

一個介面定義好了。有建造各部位的方法,最後給個createCar方法給返回一個我們想要造的車。

現在,車的類和造車的標準我們都定義好了。那我們可以開始造車了,先造一個寶馬吧。

(3)具體的建造寶馬車實現類,實現了IBuildCar介面

public class BWMBuilder implements IBuildCar {
	
	Car car;
	
	public BWMBuilder(){
		car= new Car();
	}
 
	@Override
	public void buildWheel() {
		car.setWheel("寶馬的輪子");		
	}
 
	@Override
	public void buildBody() {
		car.setBody("寶馬的車身");
	}
 
	@Override
	public void buildEngine() {
		car.setEngine("寶馬的發動機");		
	}

    @Override
	public Car createCar() {
		return car;
	}
 
}

(4)這裡就是建造者模式的精髓了director,它按照按照需要的規則或順序將最終例項的各部分進行組裝

public class Director {
	public Car createCarByDirecotr(IBuildCar bc){
		bc.buildBody();
		bc.buildEngine();
		bc.buildWheel();
		return bc.createCar();
	}
}

這個director的重點在於createCarByDirecotr的引數是我們的造車標準的介面。這樣一來,只要是實現了我們的這個介面的類,就都可以作為引數,那我們不僅可以造寶馬,還可以造賓士,法拉利,只要我們把我們想造的車對應的類寫好就行了。


(5)測試

public class BuilderTest {
	public static void main(String[] args){
		Director director = new Director();
		Car car = director.createCarByDirecotr(new BWMBuilder());
		System.out.println(car.getWheel());
		System.out.println(car.getBody());
		System.out.println(car.getEngine());
	} 
}

輸出結果為:

寶馬的輪子
寶馬的車身
寶馬的發動機

4. 優點

(1)解耦,將產品本身與產品建立過程進行解耦,可以使用相同的建立過程來得到不同的產品。也就說細節依賴抽象。

(2)易於精確控制物件的建立 ,將複雜產品的建立步驟分解在不同的方法中,使得建立過程可控

(3)易於拓展 ,增加新的具體建造者無需修改原有類庫的程式碼,使用者使用不同的具體建造者即可得到不同的產品物件。

5. 使用場景

需要生成的產品物件有複雜的內部結構,這些產品物件具備共性;

隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;

如果產品之間的差異性很大,則不適合使用建造者模式。