日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

建造者模式(Builder Pattern)(转自TerryLee)

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 建造者模式(Builder Pattern)(转自TerryLee) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述?

在軟件系統(tǒng)中,有時(shí)候面臨著“一個(gè)復(fù)雜對(duì)象”的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法確相對(duì)穩(wěn)定。如何應(yīng)對(duì)這種變化?如何提供一種“封裝機(jī)制”來(lái)隔離出“復(fù)雜對(duì)象的各個(gè)部分”的變化,從而保持系統(tǒng)中的“穩(wěn)定構(gòu)建算法”不隨著需求改變而改變?這就是要說(shuō)的建造者模式。

本文通過(guò)現(xiàn)實(shí)生活中的買KFC的例子,用圖解的方式來(lái)詮釋建造者模式。

意圖?

將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

模型圖?

?

生活中的例子?

生成器模式將復(fù)雜對(duì)象的構(gòu)建與對(duì)象的表現(xiàn)分離開(kāi)來(lái),這樣使得同樣的構(gòu)建過(guò)程可以創(chuàng)建出不同的表現(xiàn)。這種模式用于快餐店制作兒童餐。典型的兒童餐包括一個(gè)主食,一個(gè)輔食,一杯飲料和一個(gè)玩具(例如漢堡、炸雞、可樂(lè)和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過(guò)程是相同的。無(wú)論顧客點(diǎn)的是漢堡,三名治還是雞肉,過(guò)程都是一樣的。柜臺(tái)的員工直接把主食,輔食和玩具放在一起。這些是放在一個(gè)袋子中的。飲料被倒入杯中,放在袋子外邊。這些過(guò)程在相互競(jìng)爭(zhēng)的餐館中是同樣的。

?

實(shí)現(xiàn)過(guò)程圖解?

在這里我們還是以去KFC店買套餐為例子,示意圖如下:

?

客戶端:顧客。想去買一套套餐(這里面包括漢堡,可樂(lè),薯?xiàng)l),可以有1號(hào)和2號(hào)兩種套餐供顧客選擇。

指導(dǎo)者角色:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準(zhǔn)備套餐。

建造者角色:餐館員工。按照收銀員的要求去準(zhǔn)備具體的套餐,分別放入漢堡,可樂(lè),薯?xiàng)l等。

產(chǎn)品角色:最后的套餐,所有的東西放在同一個(gè)盤子里面。

下面開(kāi)始我們的買套餐過(guò)程。

1.客戶創(chuàng)建Derector對(duì)象,并用它所想要的Builder對(duì)象進(jìn)行配置。顧客進(jìn)入KFC店要買套餐,先找到一個(gè)收銀員,相當(dāng)于創(chuàng)建了一個(gè)指導(dǎo)者對(duì)象。這位收銀員給出兩種套餐供顧客選擇:1普通套餐,2黃金套餐。完成的工作如時(shí)序圖中紅色部分所示。

產(chǎn)品(套餐)類:

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Collections;
6
7 namespace BuilderDemo
8 {
9 /// <summary>
10 /// Food類,既產(chǎn)品類
11 /// </summary>
12 public class Food
13 {
14 Hashtable food = new Hashtable();
15
16 /// <summary>
17 /// 添加食品
18 /// </summary>
19 /// <param name="strName">食品名稱</param>
20 /// <param name="Price">價(jià)格</param>
21 public void Add(string strName,string Price)
22 {
23 food.Add(strName,Price);
24 }
25
26 /// <summary>
27 /// 顯示食品清單
28 /// </summary>
29 public void Show()
30 {
31 IDictionaryEnumerator myEnumerator = food.GetEnumerator();
32 Console.WriteLine("Food List:");
33 Console.WriteLine("------------------------------");
34 string strfoodlist = "";
35 while(myEnumerator.MoveNext())
36 {
37 strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key.ToString();
38 strfoodlist = strfoodlist + ":\t" +myEnumerator.Value.ToString();
39 }
40 Console.WriteLine(strfoodlist);
41 Console.WriteLine("\n------------------------------");
42 }
43 }
44
45 }
46

2.指導(dǎo)者通知建造器。收銀員(指導(dǎo)者)告知餐館員工準(zhǔn)備套餐。這里我們準(zhǔn)備套餐的順序是:放入漢堡,可樂(lè)倒入杯中,薯?xiàng)l放入盒中,并把這些東西都放在盤子上。這個(gè)過(guò)程對(duì)于普通套餐和黃金套餐來(lái)說(shuō)都是一樣的,不同的是它們的漢堡,可樂(lè),薯?xiàng)l價(jià)格不同而已。如時(shí)序圖紅色部分所示:

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderDemo
7 {
8 /// <summary>
9 /// FoodManager類,即指導(dǎo)者
10 /// </summary>
11 class FoodManager
12 {
13 public void Construct(Builder builder)
14 {
15 builder.BuildHamb();
16
17 builder.BuildCoke();
18
19 builder.BuildChip();
20 }
21 }
22 }
23

?

?

3.建造者處理指導(dǎo)者的要求,并將部件添加到產(chǎn)品中。餐館員工(建造者)按照收銀員要求的把對(duì)應(yīng)的漢堡,可樂(lè),薯?xiàng)l放入盤子中。這部分是建造者模式里面富于變化的部分,因?yàn)轭櫩瓦x擇的套餐不同,套餐的組裝過(guò)程也不同,這步完成產(chǎn)品對(duì)象的創(chuàng)建工作。

程序?qū)崿F(xiàn):

?

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderDemo
7 {
8 /// <summary>
9 /// Builder類,即抽象建造者類,構(gòu)造套餐
10 /// </summary>
11 public abstract class Builder
12 {
13 /// <summary>
14 /// 添加漢堡
15 /// </summary>
16 public abstract void BuildHamb();
17
18 /// <summary>
19 /// 添加可樂(lè)
20 /// </summary>
21 public abstract void BuildCoke();
22
23 /// <summary>
24 /// 添加薯?xiàng)l
25 /// </summary>
26 public abstract void BuildChip();
27
28 /// <summary>
29 /// 返回結(jié)果
30 /// </summary>
31 /// <returns>食品對(duì)象</returns>
32 public abstract Food GetFood();
33 }
34
35 }
36

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderDemo
7 {
8 /// <summary>
9 /// NormalBuilder類,具體構(gòu)造者,普通套餐
10 /// </summary>
11 class NormalBuilder:Builder
12 {
13 private Food NormalFood = new Food();
14
15 public override void BuildHamb()
16 {
17 NormalFood.Add("NormalHamb","¥10.50");
18 }
19
20 public override void BuildCoke()
21 {
22 NormalFood.Add("CokeCole","¥4.50");
23 }
24
25 public override void BuildChip()
26 {
27 NormalFood.Add("FireChips","¥2.00");
28 }
29
30 public override Food GetFood()
31 {
32 return NormalFood;
33 }
34
35 }
36 }
37

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace BuilderDemo
7 {
8 /// <summary>
9 /// GoldBuilder類,具體構(gòu)造者,黃金套餐
10 /// </summary>
11 class GoldBuilder:Builder
12 {
13 private Food GoldFood = new Food();
14
15 public override void BuildHamb()
16 {
17 GoldFood.Add("GoldHamb","¥13.50");
18 }
19
20 public override void BuildCoke()
21 {
22 GoldFood.Add("CokeCole","¥4.50");
23 }
24
25 public override void BuildChip()
26 {
27 GoldFood.Add("FireChips","¥3.50");
28 }
29
30 public override Food GetFood()
31 {
32 return GoldFood;
33 }
34
35 }
36 }
37

?

4.客戶從建造者檢索產(chǎn)品。從餐館員工準(zhǔn)備好套餐后,顧客再?gòu)牟宛^員工那兒拿回套餐。這步客戶程序要做的僅僅是取回已經(jīng)生成的產(chǎn)品對(duì)象,如時(shí)序圖中紅色部分所示。

完整的客戶程序:

?

代碼 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Reflection;
6 using System.Configuration;
7
8 namespace BuilderDemo
9 {
10 /// <summary>
11 /// 客戶端
12 /// </summary>
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 FoodManager foodmanager = new FoodManager();
18
19 Builder instance;
20
21 Console.WriteLine("Please Enter Food No(1-2):");
22
23 string No = Console.ReadLine();
24
25 string foodType = ConfigurationSettings.AppSettings["No"+No];
26
27 //instance= Activator.CreateInstance(Type.GetType(foodType)) as Builder;
28
29 //instance = new NormalBuilder();
30
31 instance = (Builder)Assembly.Load("BuilderDemo").CreateInstance("BuilderDemo." + foodType);
32
33 foodmanager.Construct(instance);
34
35 Food food = instance.GetFood();
36 food.Show();
37
38 Console.ReadLine();
39 }
40 }
41 }
42

通過(guò)分析不難看出,在這個(gè)例子中,在準(zhǔn)備套餐的過(guò)程是穩(wěn)定的,即按照一定的步驟去做,而套餐的組成部分則是變化的,有可能是普通套餐或黃金套餐等。這個(gè)變化就是建造者模式中的“變化點(diǎn)“,就是我們要封裝的部分。

?

實(shí)現(xiàn)要點(diǎn)?

1、建造者模式主要用于“分步驟構(gòu)建一個(gè)復(fù)雜的對(duì)象”,在這其中“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對(duì)象的各個(gè)部分則經(jīng)常變化。

2、產(chǎn)品不需要抽象類,特別是由于創(chuàng)建對(duì)象的算法復(fù)雜而導(dǎo)致使用此模式的情況下或者此模式應(yīng)用于產(chǎn)品的生成過(guò)程,其最終結(jié)果可能差異很大,不大可能提煉出一個(gè)抽象產(chǎn)品類。
3、創(chuàng)建者中的創(chuàng)建子部件的接口方法不是抽象方法而是空方法,不進(jìn)行任何操作,具體的創(chuàng)建者只需要覆蓋需要的方法就可以,但是這也不是絕對(duì)的,特別是類似文本轉(zhuǎn)換這種情況下,缺省的方法將輸入原封不動(dòng)的輸出是合理的缺省操作。

4、前面我們說(shuō)過(guò)的抽象工廠模式(Abtract Factory)解決“系列對(duì)象”的需求變化,Builder模式解決“對(duì)象部分”的需求變化,建造者模式常和組合模式(Composite Pattern)結(jié)合使用。

效果?

1、建造者模式的使用使得產(chǎn)品的內(nèi)部表象可以獨(dú)立的變化。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
2、每一個(gè)Builder都相對(duì)獨(dú)立,而與其它的Builder無(wú)關(guān)。
3、可使對(duì)構(gòu)造過(guò)程更加精細(xì)控制。

4、將構(gòu)建代碼和表示代碼分開(kāi)。

5、建造者模式的缺點(diǎn)在于難于應(yīng)付“分步驟構(gòu)建算法”的需求變動(dòng)。

適用性?

以下情況應(yīng)當(dāng)使用建造者模式:

1、需要生成的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2、需要生成的產(chǎn)品對(duì)象的屬性相互依賴,建造者模式可以強(qiáng)迫生成順序。
3、?在對(duì)象創(chuàng)建過(guò)程中會(huì)使用到系統(tǒng)中的一些其它對(duì)象,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過(guò)程中不易得到。

應(yīng)用場(chǎng)景?

1、???RTF文檔交換格式閱讀器。

2、???.NET環(huán)境下的字符串處理StringBuilder,這是一種簡(jiǎn)化了的建造者模式。

3、???……

總結(jié)

建造者模式的實(shí)質(zhì)是解耦組裝過(guò)程和創(chuàng)建具體部件,使得我們不用去關(guān)心每個(gè)部件是如何組裝的。

?

作者:TerryLee
出處:http://terrylee.cnblogs.com?

建造者模式(Builder Pattern

轉(zhuǎn)載于:https://www.cnblogs.com/tianyutingxy/archive/2010/10/20/1856373.html

總結(jié)

以上是生活随笔為你收集整理的建造者模式(Builder Pattern)(转自TerryLee)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人一区在线 | 成人免费视频播放 | av黄色在线免费观看 | 夜噜噜 | 在线观看欧美亚洲 | 伊人av综合网 | 亚洲在线视频观看 | 天天草天天操 | 黑鬼巨鞭白妞冒白浆 | 欧美片在线观看 | 国产精品99久久久久久久 | 九九碰 | 91亚洲精品久久久蜜桃借种 | 欧美日韩国产一级片 | 亚洲黄一区 | 欧美一级黄色大片 | 一区二区三区精品视频在线观看 | 国产一级片免费在线观看 | 鲁丝av| 毛片无码一区二区三区a片视频 | 欧美黄色小说 | 成人精品国产免费网站 | 婷婷丁香激情 | 中文字幕乱码亚洲无线三区 | 99国产精品一区 | 亚洲欧美另类国产 | 欧美日本韩国一区二区 | 欧洲精品久久久久毛片完整版 | 一区二区三区视频在线观看 | 国产福利网 | 久久视频一区 | 国产免费自拍 | 日韩欧美在线视频播放 | 欧美激情一区二区三区免费观看 | 男人天堂网在线观看 | 国产成人亚洲一区二区 | 欧美午夜精品一区二区 | 少妇激情一区二区三区 | 一级看片免费视频 | www日日| 一区二区三区视频免费在线观看 | 香蕉伊思人视频 | 中文不卡av | 男女插插视频 | 久久精品国产亚洲AV熟女 | 亚洲熟女综合一区二区三区 | 久久久久亚洲AV成人无码国产 | 精品欧美一区二区久久久久 | 中文字幕+乱码+中文乱 | 中文字幕1 | 国久久久 | 日本福利一区二区三区 | 伊人久久青草 | 欧美人与性动交α欧美片 | 三级免费毛片 | aaa一级黄色片 | 日韩精品亚洲一区 | 人妻少妇精品无码专区二区 | 成人高潮片免费网站 | 精品一区二区无码 | 尤物在线 | 成年人香蕉视频 | 欧美精品一二 | 久久久久久婷婷 | 噼里啪啦动漫 | www婷婷av久久久影片 | 性生交大片免费看视频 | av永久免费观看 | 黄色成年人网站 | 深田咏美在线x99av | 天天干中文字幕 | 爱爱视频网 | 日本成人在线免费观看 | 国模在线视频 | a级黄色小视频 | 欧美无玛 | 亚洲激情另类 | 亚洲av毛片一区二二区三三区 | www.国产com| 美女av免费看 | 欧美人与动牲交a欧美精品 欧美三级在线看 | 中文字幕亚洲专区 | 影音先锋亚洲资源 | youjizz视频 | 精品久久精品 | 青青草在线免费视频 | 国产欧美一区二区三区视频在线观看 | 亚洲第一页av | 色偷偷噜噜噜亚洲男人 | 清纯唯美亚洲激情 | 午夜精品一区 | 亚洲av永久无码精品三区在线 | 日本一区二区三区免费观看 | 欧美日韩免费一区 | 日韩精品一区在线视频 | 国产精品精品视频 | 国产一级18片视频 | 婷婷国产一区二区三区 | 国产日韩片 |