13建造者模式(Builder)
Builder模式的緣起:
??? 假設創建游戲中的一個房屋House設施,該房屋的構建由幾部分組成,且各個部分富于變化。如果使用最直觀的設計方法,每一個房屋部分的變化,都將導致房屋構建的重新修正.....
動機(Motivation):
??? 在軟件系統中,有時候面臨一個"復雜對象"的創建工作,其通常由各個部分的子對象用一定算法構成;由于需求的變化,這個復雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合到一起的算法卻相對穩定。
??? 如何應對種變化呢?如何提供一種"封裝機制"來隔離出"復雜對象的各個部分"的變化,從而保持系統中的"穩定構建算法"不隨需求的改變而改變?
意圖(Intent):
??? 將一個復雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -------《設計模式》GOF
結構圖(Struct):????
???????????????
協作(Collaborations):
??????????????????
生活中的例子:
?????????????
適用性:
????1.當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
??? 2.當構造過程必須允許被構造的對象有不同的表示時。
實例代碼:
Builder類:
?1??public?abstract?class?Builder
?2?????{
?3?????????public?abstract?void?BuildDoor();
?4?????????public?abstract?void?BuildWall();
?5?????????public?abstract?void?BuildWindows();
?6?????????public?abstract?void?BuildFloor();
?7?????????public?abstract?void?BuildHouseCeiling();
?8?????
?9?????????public?abstract?House?GetHouse();
10?????}
Director類:這一部分是?組合到一起的算法(相對穩定)。
1?public?class?Director
?2?????{
?3???????public?void?Construct(Builder?builder)
?4???????{
?5???????????builder.BuildWall();
?6???????????builder.BuildHouseCeiling();??????????
?7???????????builder.BuildDoor();
?8???????????builder.BuildWindows();
?9???????????builder.BuildFloor();?????????
10???????}
11?????}
ChineseBuilder類
?1????public?class?ChineseBuilder:Builder
?2?????{
?3????????private?House?ChineseHouse?=?new?House();
?4?????????public?override?void?BuildDoor()
?5?????????{
?6?????????????Console.WriteLine("this?Door?'s?style?of?Chinese");
?7?????????}
?8?????????public?override?void?BuildWall()
?9?????????{
10?????????????Console.WriteLine("this?Wall?'s?style?of?Chinese");
11?????????}
12?????????public?override?void?BuildWindows()
13?????????{
14?????????????Console.WriteLine("this?Windows?'s?style?of?Chinese");
15?????????}
16?????????public?override?void?BuildFloor()
17?????????{
18?????????????Console.WriteLine("this?Floor?'s?style?of?Chinese");
19?????????}
20?????????public?override?void?BuildHouseCeiling()
21?????????{
22?????????????Console.WriteLine("this?Ceiling?'s?style?of?Chinese");
23?????????}
24?????????public?override?House?GetHouse()
25?????????{
26?????????????return?ChineseHouse;
27?????????}
28?????}
RomanBuilder類:
?1?????class?RomanBuilder:Builder
?2?????{
?3?????????private?House?RomanHouse?=?new?House();
?4?????????public?override?void?BuildDoor()
?5?????????{
?6?????????????Console.WriteLine("this?Door?'s?style?of?Roman");
?7?????????}
?8?????????public?override?void?BuildWall()
?9?????????{
10?????????????Console.WriteLine("this?Wall?'s?style?of?Roman");
11?????????}
12?????????public?override?void?BuildWindows()
13?????????{
14?????????????Console.WriteLine("this?Windows?'s?style?of?Roman");
15?????????}
16?????????public?override?void?BuildFloor()
17?????????{
18?????????????Console.WriteLine("this?Floor?'s?style?of?Roman");
19?????????}
20?????????public?override?void?BuildHouseCeiling()
21?????????{
22?????????????Console.WriteLine("this?Ceiling?'s?style?of?Roman");
23?????????}
24?????????public?override?House?GetHouse()
25?????????{
26?????????????return?RomanHouse;
27?????????}
28?????}
ChineseBuilder和RomanBuilder這兩個是:這個復雜對象的兩個部分經常面臨著劇烈的變化。
?1???public?class?Client
?2?????{
?3?????????public?static?void?Main(string[]?args)
?4?????????{
?5?????????????Director?director?=?new?Director();
?6?
?7?????????????Builder?instance;
?8?
?9?????????????Console.WriteLine("Please?Enter?House?No:");
10?
11?????????????string?No?=?Console.ReadLine();
12?
13?????????????string?houseType?=?ConfigurationSettings.AppSettings["No"?+?No];
14?
15?????????????instance?=?(Builder)Assembly.Load("House").CreateInstance("House."?+?houseType);
16?
17?????????????director.Construct(instance);
18?
19?????????????House?house=?instance.GetHouse();
20?????????????house.Show();
21?
22?????????????Console.ReadLine();
23?????????}
24?????}
?
1?<?xml?version="1.0"?encoding="utf-8"??>
2?<configuration>
3???<appSettings>
4?????<add?key="No1"?value="RomanBuilder"></add>
5?????<add?key="No2"?value="ChineseBuilder"></add>
6???</appSettings>
7?</configuration>
Builder模式的幾個要點:
Builder模式 主要用于“分步驟構建一個復雜的對象”。在這其中“分步驟”是一個穩定的乘法,而復雜對象的各個部分則經常變化。
Builder模式主要在于應對“復雜對象各個部分”的頻繁需求變動。其缺點在于難以應對“分步驟構建算法”的需求變動。
Abstract Factory模式解決“系列對象”的需求變化,Builder模式解決“對象部分”的需求變化。Builder械通常和Composite模式組合使用。
總結
以上是生活随笔為你收集整理的13建造者模式(Builder)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DotNet进阶系列
- 下一篇: 第十五节:Expression表达式目录