建造者模式(BuilderPattern)

原文參考出處:https://blog.csdn.net/u010102390/article/details/80179754

介紹:

        建造者模式:指將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱爲建造者模式。它是將一個複雜的對象分解爲多個簡單的對象,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。

區別工廠模式與建造者模式區別:

在抽象工廠樣式中,每一次工廠對象被呼叫時都會傳回一個完整的產品對象,而使用端有可能會決定把這些產品組裝成一個更大的和複雜的產品,也有可能不會。工廠對象是沒有狀態的,不知道上一次構建的是哪一個產品,也沒有未來的概念,不知道下一次構建的是哪一個產品,更不知道自己構建的產品在更高層的產品結構藍圖中是什麼位置。

        建造類別則不同,建造樣式的重點在導演者角色。導演者對象是有狀態的,它知道整體藍圖,知道上一次、這一次和下一次交給建造者角色去構建的零件是什麼,以便能夠將這些零件組裝成爲一個更大規模的產品。它一點一點地建造出一個複雜的產品,而這個產品的組裝程序就發生在導演者角色內部。建造者樣式的使用端拿到的是一個完整的最後產品。

      換言之,雖然抽象工廠樣式與建造樣式都是設計樣式,但是抽象工廠樣式處在更加具體的尺度上,而建造樣式則處於更加宏觀的尺度上。一個系統可以由一個建造樣式和一個抽象工廠樣式組成,使用端通過呼叫這個導演角色,間接地呼叫另一個抽象工廠樣式的工廠角色。工廠樣式傳回不同產品族的零件,而建造者樣式則把它們組裝起來。

     比如仍以衆神造人爲例,女媧利用建造樣式負責把靈魂、耳目、手臂等組合成一個完整的人,而黃帝、上駢、桑林各自利用工廠樣式創造出靈魂、耳目、臂手等。女媧不必考慮靈魂、耳目、手臂是什麼樣子、怎麼創造出來的,這就成爲一個由建造樣式和抽象工廠樣式組合而成的系統。

新建一個人的類:

public class Human {
	private String head;
	private String body;
	private String hand;
	private String foot;
	public String getHead() {
		return head;
	}
	public void setHead(String head) {
		this.head = head;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	public String getHand() {
		return hand;
	}
	public void setHand(String hand) {
		this.hand = hand;
	}
	public String getFoot() {
		return foot;
	}
	public void setFoot(String foot) {
		this.foot = foot;
	}
}

所以我們先寫一個接口。一個定義了造人標準的接口。

public interface IBuildHuman {
	public void buildHead();
	public void buildBody();
	public void buildHand();
	public void buildFoot();
	public Human createHuman();
}

造人的具體實現類

public class SmartManBuilder implements IBuildHuman {
	
	Human human;
	
	public SmartManBuilder(){
		human = new Human();
	}
 
	@Override
	public void buildHead() {
		human.setHead("智商180的頭腦");		
	}
 
	@Override
	public void buildBody() {
		human.setBody("新的身體");
		
	}
 
	@Override
	public void buildHand() {
		human.setHand("新的手");		
	}
 
	@Override
	public void buildFoot() {
		human.setFoot("新的腳");
		
	}
 
	@Override
	public Human createHuman() {
		return human;
	}
    
}

其實到這裏呢,我們已經完成了建造的過程。那就這麼簡單的建造過程,還搞了一個建造模式嗎?非也。接下來,就是介紹建造者模式的精髓,那就是director。這個director呢,就是來執行我們剛纔的造人動作的。沒錯,精髓就是我們剛纔的造人動作。我們先看代碼:

public class Director {
	public Human createHumanByDirecotr(IBuildHuman bh){
		bh.buildBody();
		bh.buildFoot();
		bh.buildHand();
		bh.buildHead();
		return bh.createHuman();
	}
}

這個director類呢,重點在於createHumanByDirecotr的參數是我們的造人標準的接口。這樣一來,只要是實現了我們的這個接口的類,就都可以作爲參數,我們剛剛不是造了一個高智商的人嗎?那我們如果想造一個身體運動能力出色的人,也就是運動員,這個director也可以啓動這個造人過程,只要我們把這個運動員的類先寫好。我們來看看director是如何發揮的:
 

public class BuilderTest {
	public static void main(String[] args){
		Director director = new Director();
		Human human = director.createHumanByDirecotr(new SmartManBuilder());
		System.out.println(human.getHead());
		System.out.println(human.getBody());
		System.out.println(human.getHand());
		System.out.println(human.getFoot());
	} 
	
}

當createHumanByDirecotr這個方法帶的參數就是我們高智商人的那個類。那我們想造一個運動員,就可以像高智商人那樣建好類,然後傳進來就可以了!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章