設計模式 建造者模式

2021-08-09 07:56:11 字數 2614 閱讀 3190

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

什麼是複雜物件呢?舉個栗子,乙個賽車遊戲,裡面的汽車就是複雜的物件,只不過這些複雜的物件都不一樣,有不同的輪胎,不同的電池,不同的發動機等等。

建造者模式中有這麼幾個角色:抽象建造者、具體建造者、產品角色、指揮者。

抽象建造者:它為建立乙個產品物件(汽車)的各個部件指定抽象介面,該介面中一般會有兩種方法,一種是建立各種部件,一種是返回該物件。

具體建造者:實現或繼承了抽象建造者,用於構建複雜物件,實現了抽象建造者中建立各種部件的方法。

產品類:複雜物件,這個產品需要由許多複雜的物件裝配而成。

指揮者者:這個指揮者,負責呼叫建造者中關於產品部件建立、裝配的方法。

這裡你可能會覺得奇怪,為什麼會多出個指揮者。這個指揮者其實我們生活中也經常碰到,例如乙個銷售**員,我們像乙個銷售**員報出產品的引數,銷售**員只需要把型號、配置報給產家,組裝與構建產品的工作它都不需要做。

//汽車原型

public class car

public void setwheel(string wheel)

public string getbattery()

public void setbattery(string battery)

public string getengine()

public void setengine(string engine)

}//抽象建造者

public abstract class carbuilder

}//具體建造者

public class attackbuilder extends carbuilder

public void buildbattery()

public void buildengine()

}//指揮者

public class carcontroller

}//客戶端

public class client

}賽車遊戲裡有許多不同的汽車,汽車是由許多不同的部件組合構成的物件,這個物件的裝配要與客戶端分離。使用者想要什麼汽車,只需要向指揮者傳入乙個引數,把具體車的構建類傳過去,剩下的事由指揮類去做。

指揮類負責呼叫按次序配裝方法,產生不同的部件,最後將東西組裝起來,返回乙個完整的物件。

如果有一輛車不需要建立電池,不需要組裝電池,它自帶電池··· 類似這種情況,我們就可以用鉤子方法。

//具體產品

public class car

public void setwheel(string wheel)

public string getbattery()

public void setbattery(string battery)

public string getengine()

public void setengine(string engine)

}//抽象建造者

public abstract class carbuilder

//返回產品物件

public car createcat()

}//具體建造者

public class attackbuilder extends carbuilder

public void buildwheel()

public void buildengine()

boolean isbattery()

public void buildbattery() {}

}//指揮類

public class carcontroller

car = cb.createcat();

return car;

}}//客戶端

public class client

}

一旦這種汽車本身帶有電池,我就不用去build電池。

上面這兩個例子,我覺得還是比較容易理解的,比單例模式和原型模式只難一點點。我唯一暈的地方,在於抽象建造者中的 protected car car = new car();

當有乙個具體的構建者從它這裡繼承的時候,自動就有乙個car物件。還有抽象建造者中的方法createcat(),在繼承(或實現)之後,沒有重寫這個方法。

優點:工廠模式是建立乙個簡單的部件,而建造者模式是建立乙個複雜的整體,後者在複雜物件的建立下更適用一些。建造者模式中的指揮類,還會按次序構建部件,邏輯清晰。

建造者模式和三個工廠模式有些優點是相同的,例如物件建立不在客戶端、客戶端不需要知道產品內部建造的細節。

我們新增乙個具體的產品,就需要新增乙個具體的建造者,幾乎無論怎麼增加,我們都不用修改之前的建造者和產品。

缺點:

如果產品差異太大,它們的建造者就不一樣,這樣不適用了。想一想,汽車和飛機,都是不同的複雜物件,我們的建造者不能從汽車的抽象建造者類繼承。

2017/10/14 9:37:04 @author:雲都小生(cloudking)

設計模式 建造者模式

在gof的23種設計模式中對builder pattern的定義是 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。從程式角度來說,就是在基類定義某種事物建立的過程或業務流程,在子類進行重寫或是使用基類方法。這樣建立出來的例項不會因為過程或流程的丟失而使業務失敗。舉例來說,...

設計模式建造者模式

今天看了乙個設計模式。總結下,以免忘了。如何引入建造者模式的呢?作者舉了個例子。建造小人。當然需要 頭,左手,右手,左腳,右腳,軀幹。建造的過程使用 使用類裡面的方法就行了。但是如果需要乙個胖的小人,乙個瘦的小人呢?就需要重新構造乙個胖人類,乙個瘦人類。當然 使用者還需要自己處理構造的過程。這樣 就...

設計模式 建造者模式

定義 將乙個複雜的物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示。包括的要素 1 產品類 2 抽象建造者或者介面 3 建造者 4 導演類 建造者模式的優點 首先,建造者模式的封裝很好,使用建造者模式可以有效地封裝變化,注意在使用建造者模式的場景中,一般產品類和建造者介面是比較穩定的,...