天天看點

菜鳥之路-淺談設計模式之建造者模式建造者模式

參考文章 http://blog.csdn.net/hello_haozi/article/details/38819935

http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html

建造者模式

定義

将一個複雜對象的構造與它的表示分離,使同樣的建構過程可以建立不同的表示,這樣的設計模式被稱為建造者模式(太抽象了,朕表示不能了解啊,啊,啊)

産品的内部表象

  一個産品常有不同的組成成分作為産品的零件,這些零件有可能是對象,也有可能不是對象,它們通常又叫做産品的内部表象(internal representation)。不同的産品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使用戶端不需要知道所生成的産品有哪些零件,每個産品的對應零件彼此有何不同,是怎麼建造出來的,以及怎麼組成産品。

菜鳥之路-淺談設計模式之建造者模式建造者模式

先來看看這個UML圖 建立一個産品類,産品類有兩個零件part1和part2 建立一個接口Builder,用于建立兩個零件,并有一個傳回産品的方法用于傳回産品( builder的意思是建造者或者建築勞工。例如:樓房是千差萬别的,樓房的外形,層數,内部房間的數量,房間的裝飾都不一樣。但是對于建造者來說,抽象出來的建築流程是确定的。因為建築一座樓房,都可以歸納為幾個步驟:1打樁、2建地基、3搭架構、4内部建設。同理,建造者設計模式也是基于這樣的概念而生的,這個設計模式用來解決什麼樣的情況呢:即流程不變,但每個流程實作的具體細節是會變化的。這樣的情況,可以考慮使用建造者。就像蓋房子,4個流程都必須有,但每個流程各自的實作細節,各個房子各有不同。建造者模式的好處就是保證了流程不會變化,即流程不會增加也不會遺漏,也不會産生流程次序的錯誤。這是非常重要的,看新聞,一些樓歪歪的事件,很多都是建設樓盤的時候,流程出現了問題導緻的。(看來這些人并不知道建造者模式啊)。而建造者模式,保證了流程的确定性,而流程内部的實作細節,是可繼承擴充的。從根源上解決了流程不規範的問題。)

建立具體建造類ConcreteBuilder具體實作Builder裡的方法。 建立一個導演類,導演類持有一個Builder引用,這樣在construct方法裡可以調用builder.buildPart1()和builder.buildPart2()來建立産品 最後在用戶端調用就好了,放上用戶端代碼

public class Client {
    public static void main(String[]args){
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.retrieveResult();
        System.out.println(product.getPart1());
        System.out.println(product.getPart2());
    }
}
           

好了,多說無益,上執行個體 首先建立一個People類(相當于産品)

public class People {
	private String foot;
	private String hand;
	
	public String getFoot() {
		return foot;
	}
	public void setFoot(String foot) {
		this.foot = foot;
	}
	public String getHand() {
		return hand;
	}
	public void setHand(String hand) {
		this.hand = hand;
	}
}
           

然後建立一個天使接口(相當于builder)和具體的天使類,天使A(相當于具體builder)

public interface TianShi {
	public void CreateFoot();
	public void CreateHand();
	public People returnPeople();
}

public class TianShiA implements TianShi{
	private People people=new People();
	
	@Override
	public void CreateFoot() {
		people.setFoot("麒麟腳");
	}
	@Override
	public void CreateHand() {
		people.setHand("右手麒麟臂");
	}
	@Override
	public People returnPeople() {
		return people;
	}
}
           

再建立一個God類(相當于direct),在創人之初,天使造了個隻有腳的人,後來發現不行啊,少了點什麼,不能自己嘿嘿嘿(腦補費玉清)後來就造了手,後來,上帝規範了流程,造人先造腳,再造手。

public class God {
	private TianShi tianShi;
	public God(TianShi tianShi) {
		this.tianShi=tianShi;
	}
	public void CreatePeople(){
		tianShi.CreateFoot();
		tianShi.CreateHand();
		System.out.println("流程正确");
	}
}
           

最後寫一個Client類

public class Client {
	public static void main(String[] args) {
		TianShi tianShi=new TianShiA();
		God god=new God(tianShi);
		god.CreatePeople();
		People people=tianShi.returnPeople();
		System.out.println(people.getFoot());
		System.out.println(people.getHand());
	}
}
           

輸出結果: 流程正确

麒麟腳

右手麒麟臂

(以下内容摘自上面兩個連結)

建造模式分成兩個很重要的部分:

  1. 一個部分是Builder接口,這裡是定義了如何建構各個部件,也就是知道每個部件功能如何實作,以及如何裝配這些部件到産品中去;

  2. 另外一個部分是Director,Director是知道如何組合來建構産品,也就是說Director負責整體的建構算法,而且通常是分步驟地來執行。

  不管如何變化,建造模式都存在這麼兩個部分,一個部分是部件構造和産品裝配,另一個部分是整體建構的算法。認識這點是很重要的,因為在建造模式中,強調的是固定整體建構的算法,而靈活擴充和切換部件的具體構造和産品裝配的方式。

  再直白點說,建造模式的重心在于分離建構算法和具體的構造實作,進而使得建構算法可以重用。具體的構造實作可以很友善地擴充和切換,進而可以靈活地組合來構造出不同的産品對象

使用建造者模式的好處

   1.使用建造者模式可以使用戶端不必知道産品内部組成的細節。

    2.具體的建造者類之間是互相獨立的,對系統的擴充非常有利。

    3.由于具體的建造者是獨立的,是以可以對建造過程逐漸細化,而不對其他的子產品産生任何影響。

在什麼情況下使用建造模式

  1. 需要生成的産品對象有複雜的内部結構,每一個内部成分本身可以是對象,也可以僅僅是一個對象(即産品對象)的一個組成部分。

  2. 需要生成的産品對象的屬性互相依賴。建造模式可以強制實行一種分步驟進行的建造過程,是以,如果産品對象的一個屬性必須在另一個屬性被指派之後才可以被指派,使用建造模式是一個很好的設計思想。

  3. 在對象建立過程中會使用到系統中的其他一些對象,這些對象在産品對象的建立過程中不易得到。

好了,如果還有什麼不懂的建議讀讀上面連結裡的文章,肯定會讓你豁然開朗,吃水要不忘挖井人嘛,哈哈

繼續閱讀