java建造者模式--給一個你一看就懂的建造者模式

在開始寫這個建造者模式的文章前,我也確實看了挺多次其他介紹這個模式的文章。感覺看了很多次纔有一點對建造者模式明白透徹的感覺。細心想來,可能是接口的理解不好,平時工作比較少用到過建造者模式,所以理解的比較慢。所以看通了建造者模式,就可以加深自己對接口的理解。

好了,接下來讓我們進入正題,建造者模式呢,很多其他介紹這個文章的內容中都提到了4個角色。什麼builder,director的一時讓同爲初次瞭解到建造者模式的這個概念感受到困惑不已。後來看明白才發現,這些角色和我們開始理解建造者模式不是充分必要關係。我們完全可以等了解了建造者模式後才總結出這幾個角色。所以我決定一開始先不扯這些概念性的東西,而是一步一步引導讀者來揭開建造者模式的面紗。

那從例子開始,建造者模式就是要造東西嘛,造點啥呢?我腦海中曾經一頓掙扎,什麼,造汽車啊,大樓啊,電腦啊等等,後來發現還是簡單點造個人吧。這樣大家都好理解。讀者也可以理解造機器人。只要你喜歡。

那我們新建一個人的類。

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

這個就是人的類了,我們取名爲human。只要是人都是這個類出來的。

那我們想要造人的話,得有一個標準吧? 來要造人的話得有一個步驟吧?頭,身體,手,腳,那都得有。

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

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

看,一個接口定義好了。有各種造部位的方法,最後給個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;
	}
    
}

這個高智商的造人過程自然是實現了IBuildHuman這個造人標準的接口了。然後就是set方法,最後返回造好的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());
	} 
	
}

輸出結果爲:

智商180的頭腦
新的身體
新的手
新的腳

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

建造者模式就是這樣。那到最後,我們必須要思考一下爲什麼這麼做?學而不思則罔,我們縱觀全部代碼,其實我們就會發現,在最後的BuilderTest類中,我們其實根本就不會知道具體是怎麼造人的,因爲這個過程讓director給代勞了。然後,我們的SmartManBuilder類中才是真正的造人方法。director其實只是執行了這個過程。這樣子,達到了分離模塊的功能。造人的過程,啓動造人的過程,和最後選擇哪種人來造。都分的清清楚楚。就有了一些模塊化的感覺,這樣維護和擴展都是很方便的。所以設計模式的精髓還是那幾個原則。感覺原則纔是法則,而這麼多模式就是具體的招式。今天的建造者模式就到這裏。希望看到這裏的你可以明白!謝謝!如果有問題,歡迎留言交流!


作者:易灬小俠
來源:CSDN
原文:https://blog.csdn.net/u010102390/article/details/80179754
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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