建造者模式又稱生成器模式,它將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。這就要求,咱們所要處理的對象必需要有很是強的結構化特徵,對於開發人員而言,須要抽象出通常的結構化接口出來,方便進行構建工做。 html
做爲一名碼農,最可貴的應該就是找對象了,就算勉強找到了,要是對人家很差,人家可就離你遠去了。因此要對人家好點,學會作飯,多弄幾個花樣出來,讓生活充滿新鮮感,小兩口的感情也會愈來愈深了。ide
這個時候建造者模式就閃亮登場了,咱們所吃的飯,無非是炒菜,主食,另外還須要弄湯類或者飲料類東西,只要將這些東西抽象出來,那麼天天的飯菜內容就穩定了,永遠變化的是具體的炒菜品類、主食品類和湯的品類。要始終謹記,穩定的東西都是抽象後的東西,不要一會兒就陷入到細節中去。ui
經過UML類圖,咱們能夠知道建造者模式有如下幾個角色:this
Director:從抽象角度建立對象的各個部分,同時根據要求設計建立各個部分的順序。spa
Builder:給出一個抽象接口,以規範產品對象的各個組成部分的建造。設計
ConcreteBuilder:實現Builder接口,具體化建立對象的各個部分。 並提供具體的實例。3d
Product:要建立的複雜對象。此處指的是Meal。固然該類能夠不用,只保留概念也是能夠的。code
接下來的範例就是要爲女友準備不一樣的飯菜,以達生活新鮮感的目的,要好好學哦。htm
1: public class Meal
2: {
3: private string mainMeal;
4: private string stirFry;
5: private string soup;
6:
7: public Meal(string mainMeal, string stirFry, string soup)
8: {
9: this.mainMeal = mainMeal;
10: this.stirFry = stirFry;
11: this.soup = soup;
12: }
13:
14: public void Show(string mealType)
15: {
16: Console.WriteLine(mealType);
17:
18: Console.WriteLine("主食:" + this.mainMeal);
19: Console.WriteLine("菜類:" + this.stirFry);
20: Console.WriteLine("湯類:" + this.soup);
21: }
22: }
23:
24: public abstract class Builder
25: {
26: public abstract void BuildMainMeal(string mainMeal);
27:
28: public abstract void BuildStirFry(string stirFry);
29:
30: public abstract void BuildSoup(string soup);
31:
32: public abstract Meal MealBuilder();
33: }
34:
35: public class BreakfastBuilder : Builder
36: {
37: private string mainMeal;
38: private string stirFry;
39: private string soup;
40:
41: public override void BuildMainMeal(string mainMeal)
42: {
43: this.mainMeal = mainMeal;
44: }
45:
46: public override void BuildStirFry(string stirFry)
47: {
48: this.stirFry = stirFry;
49: }
50:
51: public override void BuildSoup(string soup)
52: {
53: this.soup = soup;
54: }
55:
56: public override Meal MealBuilder()
57: {
58: return new Meal(mainMeal, stirFry, soup);
59: }
60: }
61:
62: public class Director
63: {
64: private Builder builder;
65: public Director(Builder builder)
66: {
67: this.builder = builder;
68: }
69:
70: public void Construct(string mainMeal, string stirFry, string soup)
71: {
72: builder.BuildMainMeal(mainMeal);
73: builder.BuildStirFry(stirFry);
74: builder.BuildSoup(soup);
75: }
76: }
調用對象
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Builder builder = new BreakfastBuilder();
6: Director director = new Director(builder);
7: director.Construct("八寶粥","香菇青菜","番茄雞蛋湯");
8:
9: Meal meal = builder.MealBuilder();
10:
11: meal.Show("親,吃早餐啦");
12: Console.Read();
13: }
14: }
運行結果:
固然,我這早餐,估計不過關的機率十分的大。
優勢:
一、建造者模式有更好的封裝性和細節隱藏的特色,調用者無需也沒法關注到細節部分。
二、因爲建造者對對象自己以及建立過程進行了很是細緻的拆分,使得咱們能夠精細控制細節部分,減小風險。
缺點:
一、若是內部很是複雜的話,會生成太多太多的類,以致於會擴大咱們的關注點,加大了代碼的維護難度。
二、因爲建造者模式自己很複雜,因此咱們須要將建造者模式應用於經過環境下,否則只爲了一種場景編寫,實在是耗費精力,這也就帶來了建造模式的使用範圍。
建造者模式要求咱們使用抽象思惟來面對問題,其建造過程與表示分離是其最大特徵,若是建造過程可變,同時具備高度的結構化,咱們使用建造者模式是很是有幫助的。
關於表示的功能,咱們能夠理解爲,只是一個抽象接口,可是因爲咱們能夠改變其構建順序或者選擇構建結構,使得表示能夠多樣化,此刻咱們使用建造者模式也是有益的。