建造者模式簡介 建造者模式又稱生成器模式,它將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。這就要求,我們所要處理的對象必須要有非常強的結構化特征,對於開發人員而言,需要抽象出一般的結構化介面出來,方便進行構建工作。 作為一名碼農,最難得的應該就是找對象了,就算勉強找到了, ...
建造者模式簡介
建造者模式又稱生成器模式,它將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。這就要求,我們所要處理的對象必須要有非常強的結構化特征,對於開發人員而言,需要抽象出一般的結構化介面出來,方便進行構建工作。
作為一名碼農,最難得的應該就是找對象了,就算勉強找到了,要是對人家不好,人家可就離你遠去了。所以要對人家好點,學會做飯,多弄幾個花樣出來,讓生活充滿新鮮感,小兩口的感情也會越來越深了。
這個時候建造者模式就閃亮登場了,我們所吃的飯,無非是炒菜,主食,另外還需要弄湯類或者飲料類東西,只要將這些東西抽象出來,那麼每天的飯菜內容就穩定了,永遠變化的是具體的炒菜品類、主食品類和湯的品類。要始終謹記,穩定的東西都是抽象後的東西,不要一下子就陷入到細節中去。
建造者模式UML類圖
通過UML類圖,我們可以知道建造者模式有以下幾個角色:
Director:從抽象角度創建對象的各個部分,同時根據要求設計創建各個部分的順序。
Builder:給出一個抽象介面,以規範產品對象的各個組成部分的建造。
ConcreteBuilder:實現Builder介面,具體化創建對象的各個部分。 並提供具體的實例。
Product:要創建的複雜對象。此處指的是Meal。當然該類可以不用,只保留概念也是可以的。
範例
接下來的範例就是要為女朋友準備不同的飯菜,以達生活新鮮感的目的,要好好學哦。
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: }
運行結果:
當然,我這早餐,估計不過關的概率十分的大。
建造者模式優缺點
優點:
1、建造者模式有更好的封裝性和細節隱藏的特點,調用者無需也無法關註到細節部分。
2、由於建造者對對象本身以及創建過程進行了非常細緻的拆分,使得我們可以精細控制細節部分,減少風險。
缺點:
1、如果內部非常複雜的話,會生成太多太多的類,以至於會擴大我們的關註點,加大了代碼的維護難度。
2、由於建造者模式本身很複雜,所以我們需要將建造者模式應用於通過環境下,不然只為了一種場景編寫,實在是耗費精力,這也就帶來了建造模式的使用範圍。
建造者模式使用範圍的思考
建造者模式要求我們使用抽象思維來面對問題,其建造過程與表示分離是其最大特征,如果建造過程可變,同時具有高度的結構化,我們使用建造者模式是非常有幫助的。
關於表示的功能,我們可以理解為,只是一個抽象介面,但是由於我們可以改變其構建順序或者選擇構建結構,使得表示可以多樣化,此刻我們使用建造者模式也是有益的。