IronMan之工廠
10年積累的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有西鄉(xiāng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
前言
實(shí)用為主,學(xué)一些用得到的技術(shù)更能在如今的社會(huì)里保命。 雖然在日常的工作中設(shè)計(jì)模式不是經(jīng)常的用到,但是呢,學(xué)習(xí)它只有好處沒有壞處。
設(shè)計(jì)模式像是一種“標(biāo)簽”,它是代碼編寫者思想的體現(xiàn)。有木有感覺到這樣很便捷?看到一些代碼的時(shí)候就很清楚的了解編寫者的思想了,這是為什么呢?因?yàn)榫帉懻邆冇昧恕皹?biāo)簽”,而你恰恰是知道“標(biāo)簽”意思的。 跟一異曲同工,在學(xué)習(xí)框架、了解框架的對(duì)象模型的時(shí)候,“標(biāo)簽”是時(shí)常出現(xiàn),如果你不了解“標(biāo)簽”的意思那多痛苦?。。。。?! 還有好多,不去一一闡述了。
工作中需求的變更時(shí)常令我們頭疼不已,總是要按著需求來重新的修改代碼,然后發(fā)布新的產(chǎn)品版本,或者是出更新包。 在需求變更中,對(duì)應(yīng)著代碼也要修改,但是這修改也是分層次的。比如修改的模板在當(dāng)初設(shè)計(jì)的時(shí)候遵循了開閉原則(OCP)的話,代碼的修改就變的輕松的多了。
我想制造出一個(gè)像電影《鋼鐵俠》里面那樣的的一身盔甲,又或者說是機(jī)器吧,我把這個(gè)想法告訴了我的朋友們,他們都認(rèn)為我瘋了。
好吧,我說的是用代碼抽象的制造出”鋼鐵俠“
廢話不多說,下面這個(gè)系列是用鋼鐵俠(IronMan)作為主題的設(shè)計(jì)模式 今天來學(xué)習(xí)簡(jiǎn)單工廠模式、工廠方法模式、以及抽象工廠模式。
問題的發(fā)現(xiàn)
需求:
“玩具廠”有一天找到我說:“Jin叫獸我們這需要一些部件,我們會(huì)提供“圖紙”,請(qǐng)您幫忙制造,您看有問題嗎?”。
我:“當(dāng)然沒有問題了。很樂意幫助你們”。
“玩具廠”:“噢!好的。Jin叫獸,時(shí)間方面還有什么問題嘛?”
我:“沒問題的,我會(huì)盡快的”。
“玩具廠”:“那真的太感謝您了,Jin叫獸。我們就不打擾您了,先走了?!?br />我:“晚上一起吃頓飯吧”。
“玩具廠”:“Jin叫獸不必客氣啊”。
我:“好,你們慢走”。
生產(chǎn)車間:
“一點(diǎn)挑戰(zhàn)性都沒有,隨隨便便就制造出來了。先從組成‘鋼鐵俠’的部件開始生產(chǎn)吧?!?br />既然是這樣,那就從部件開始生產(chǎn)吧。
這里是“玩具廠”提供的“鋼鐵俠”右臂的“圖紙”:
1 public class RightHandComponent 2 { 3 public RightHandComponent() 4 { 5 this.strName = "毅代先鋒號(hào)一代右部件"; 6 7 } 8 public RightHandComponent(string strname) 9 { 10 this.strName = strname; 11 } 12 private string strName = string.Empty; 13 public string Name 14 { 15 get { return strName; } 16 set { strName = value; } 17 } 18 }
還有一個(gè)左臂部件的“圖紙”:
1 public class LeftHandComponent 2 { 3 public LeftHandComponent() 4 { 5 this.strName = "毅代先鋒號(hào)一代左部件"; 6 } 7 private string strName = string.Empty; 8 public string Name 9 { 10 get { return strName; } 11 set { strName = value; } 12 } 13 }
還有若干“圖紙”…… 不在這篇一一列舉了,在后面文章中會(huì)全面的講解到。
開始生產(chǎn)
RightHandComponent rightcomponent = new RightHandComponent(); LeftHandComponent leftcomponent = new LeftHandComponent();
若干的部件
被我一個(gè)個(gè)的按照?qǐng)D紙給制造了出來。
這樣就可以拿rightcomponent、leftcomponent……等等的一些制造好的部件組裝了。
我也可以給“玩具廠”打電話了,可以交貨收錢??墒请娫挻蛲昵闆r又變了,
中間的對(duì)話就不說了,“玩具廠”的意思就是這樣的。比如說“運(yùn)輸途中”出現(xiàn)“損壞”,他們希望用一個(gè)很快捷便利的方式能得到部件。
簡(jiǎn)單工廠
嗯,我想了一下,不過對(duì)于我Jin叫獸來說都是小事,待我造出來一臺(tái)部件生產(chǎn)器來。他們拿著機(jī)器自己回家生產(chǎn)不就ok了。
public class IronManComponentFactory { public static object CreateComponent(string comname) { switch (comname) { case "RightCom": return new RightHandComponent(); case "LeftCom": return new LeftHandComponent(); 等等…… } return null; } }
這樣生產(chǎn)的“機(jī)器”就好了,我得自己試用一下,看看效果怎么樣。
1 RightHandComponent rightcomponent = IronManComponentFactory.CreateComponent("RightCom") as RightHandComponent; 2 LeftHandComponent leftcomponent = IronManComponentFactory.CreateComponent("LeftCom") as LeftHandComponent;
這樣反而多此一舉了,第一步,向機(jī)器輸入了命令以便自己獲得想要的部件,第二步,在生產(chǎn)出來后我還得把“圖紙”拿過來比對(duì)一下。 在我一籌莫展的時(shí)候,“玩具廠”給我發(fā)了個(gè)郵件,給我發(fā)了一份“部件規(guī)范說明書”,要求我的機(jī)器生產(chǎn)出的部件是達(dá)到說明書標(biāo)準(zhǔn)的。
那我們就來看一下這個(gè)所謂的“部件規(guī)范說明書”
1 public abstract class Component 2 { 3 private string strName = string.Empty; 4 /// <summary> 5 /// 名稱 6 /// </summary> 7 public string Name 8 { 9 get { return strName; } 10 set { strName = value; } 11 } 12 /// <summary> 13 /// 自我描述 14 /// </summary> 15 public abstract void Self_Described(); 16 }
看完這個(gè)“部件規(guī)范說明書”,我已經(jīng)無力吐槽,沒辦法了,只有重新設(shè)計(jì)部件了,“圖紙”要重新繪制,因?yàn)橐凑漳窃撍赖摹耙?guī)范說明書”。
再看一下各個(gè)部件的“圖紙”
1 public class RightHandComponent:Component 2 { 3 public RightHandComponent() 4 { 5 base.Name = "毅代先鋒號(hào)一代右部件"; 6 //fWeight=材質(zhì)輸出 7 } 8 public RightHandComponent(string strname) 9 { 10 base.Name = strname; 11 } 12 public override void Self_Described() 13 { 14 Console.WriteLine(base.Name); 15 } 16 } 17 public class LeftHandComponent:Component 18 { 19 public LeftHandComponent() 20 { 21 base.Name = "毅代先鋒號(hào)一代左部件"; 22 } 23 public LeftHandComponent(string strname) 24 { 25 base.Name = strname; 26 } 27 public override void Self_Described() 28 { 29 Console.WriteLine(base.Name); 30 } 31 }
等等一些部件……
這下我再把原來的搭好的“生產(chǎn)機(jī)器”拆了,內(nèi)部修改一下,來看一下修改后的“機(jī)器”
1 public class IronManComponentFactory 2 { 3 public static Component CreateComponent(string comname) 4 { 5 switch (comname) 6 { 7 case "RightCom": 8 return new RightHandComponent(); 9 case "LeftCom": 10 return new LeftHandComponent(); 11 12 } 13 return null; 14 } 15 }
自己來測(cè)試一下:
1 Component rightcomponent = IronManComponentFactory.CreateComponent("RightCom"); 2 Component leftcomponent = IronManComponentFactory.CreateComponent("LeftCom"); 3 rightcomponent.Self_Described(); 4 leftcomponent.Self_Described();
于是,我很放心的就交給了“玩具廠”使用了,還得了個(gè)好評(píng)。
工廠方法
好景不長(zhǎng),“玩具廠”再次來電,提出一個(gè)要求,想讓我的“生產(chǎn)機(jī)器”里面還可以生產(chǎn)更多的符合“部件規(guī)范說明書”的部件。
這樣說來是要改裝“生產(chǎn)機(jī)器”了。 可以說“玩具廠”是故意的,絕對(duì)是故意的。這下整蒙圈了,虧血本了,“生產(chǎn)機(jī)器”又要拆了…… 直接來看“生產(chǎn)機(jī)器”的圖紙
1 public abstract class IronManComponentFactory 2 { 3 protected string factoryName = string.Empty; 4 protected void InitDataMessage() 5 { 6 Console.WriteLine("生產(chǎn)機(jī)器:" + factoryName + ".準(zhǔn)備就緒"); 7 } 8 public abstract Component CreateComponent(); 9 } 10 public class RightComFactory:IronManComponentFactory 11 { 12 13 public override Component CreateComponent() 14 { 15 base.factoryName = "右臂部件生產(chǎn)器"; 16 InitDataMessage(); 17 return new RightHandComponent(); 18 } 19 } 20 public class LeftComFactory:IronManComponentFactory 21 { 22 23 public override Component CreateComponent() 24 { 25 base.factoryName = "左臂部件生產(chǎn)器"; 26 InitDataMessage(); 27 return new LeftHandComponent(); 28 } 29 } 30 public class PottingFactrory 31 { 32 /// <summary> 33 /// 取件口 34 /// </summary> 35 /// <param name="comFactory"></param> 36 /// <returns></returns> 37 public static Component ComExit(IronManComponentFactory comFactory) 38 { 39 if (comFactory != null) 40 { 41 return comFactory.CreateComponent(); 42 } 43 return null; 44 } 45 }
我們通過“取件口”取件
1 Component component = PottingFactrory.ComExit(new RightComFactory()); 2 component.Self_Described();
我們只要通過更換“生產(chǎn)插件”,從“取件口”獲得不同的部件。 或者更改需求,又要生產(chǎn)符合“規(guī)范說明書”的另一些產(chǎn)品的時(shí)候,可以自定義來實(shí)現(xiàn)“生產(chǎn)插件”,插入“生產(chǎn)機(jī)器”即可。
這樣可以送給“玩具廠”使用了。這次得到了很好的一個(gè)評(píng)價(jià),我也可以休息一下了。
這里的工廠方法是開閉原則(OCP)的實(shí)現(xiàn),很優(yōu)雅的顯示出了設(shè)計(jì)原則和設(shè)計(jì)模式的美。
抽象工廠
“對(duì),沒錯(cuò)?!婢邚S’又來了……?!?br />這次“玩具廠”是把Iron部件升級(jí)了,二代部件出來了,是在一代的基礎(chǔ)上做了一些個(gè)性化的設(shè)計(jì)。來看新增部件的“圖紙”
1 public class RightHandComponent2 : Component 2 { 3 public RightHandComponent2() : this("毅代先鋒號(hào)二代右部件") { } 4 public RightHandComponent2(string strname) 5 { 6 base.Name = strname; 7 } 8 public override void Self_Described() 9 { 10 Console.WriteLine("自描述:我是->" + base.Name); 11 } 12 } 13 14 public class LeftHandComponent2 : Component 15 { 16 public LeftHandComponent2() : this("毅代先鋒號(hào)一代左部件") { } 17 public LeftHandComponent2(string strname) 18 { 19 base.Name = strname; 20 } 21 public override void Self_Described() 22 { 23 Console.WriteLine("自描述:我是->" + base.Name); 24 } 25 }
按照“規(guī)范說明書”,添加了兩張“圖紙”,它們分別是二代的左右手部件。
部件的整體結(jié)構(gòu)沒怎么變,但是“生產(chǎn)機(jī)器”的“規(guī)范說明”就要更改了,以為在上面說到的“生產(chǎn)插件”也要重新更改。
先來看一下“生產(chǎn)機(jī)器”的“規(guī)范說明”:
1 public abstract class IronManComponentFactory 2 { 3 protected string factoryName = string.Empty; 4 protected void InitDataMessage() 5 { 6 Console.WriteLine("生產(chǎn)機(jī)器:" + factoryName + ".準(zhǔn)備就緒"); 7 } 8 public abstract Component CreateComponent(); 9 public abstract Component CreateComponent2(); 10 11 12 }
當(dāng)然嘍,“規(guī)范說明”都改了,那上面說過的兩個(gè)生產(chǎn)插件也得改了:
1 public class RightComFactory : IronManComponentFactory //右部件生產(chǎn)插件 2 { 3 4 public override Component CreateComponent() 5 { 6 base.factoryName = "新右臂部件生產(chǎn)器"; 7 InitDataMessage(); 8 return new RightHandComponent(); 9 } 10 11 public override Component CreateComponent2() 12 { 13 base.factoryName = "新右臂部件生產(chǎn)器"; 14 InitDataMessage(); 15 return new RightHandComponent2(); 16 } 17 } 18 19 public class LeftComFactory : IronManComponentFactory //左部件生產(chǎn)插件 20 { 21 22 public override Component CreateComponent() 23 { 24 base.factoryName = "新左臂部件生產(chǎn)器"; 25 InitDataMessage(); 26 return new LeftHandComponent(); 27 } 28 29 public override Component CreateComponent2() 30 { 31 base.factoryName = "新左臂部件生產(chǎn)器"; 32 InitDataMessage(); 33 return new LeftHandComponent2(); 34 } 35 }
所要做的修改都是連帶關(guān)系,包裝”生產(chǎn)機(jī)器“的”取件口“也要改:
1 public class PottingFactory 2 { 3 private IronManComponentFactory comFactory = null; 4 5 public IronManComponentFactory ComFactory 6 { 7 get { return comFactory; } 8 set { comFactory = value; } 9 } 10 public PottingFactory(IronManComponentFactory comFactory) 11 { 12 this.comFactory = comFactory; 13 } 14 /// <summary> 15 /// 取件口 16 /// </summary> 17 /// <param name="comFactory"></param> 18 /// <returns></returns> 19 //public static Component ComExit(IronManComponentFactory comFactory) 20 //{ 21 // if (comFactory != null) 22 // { 23 // return comFactory.CreateComponent(); 24 // } 25 // return null; 26 //} 27 }
到這里就差不多結(jié)束了。在工廠方法模式上 做了稍稍的(幾乎全改了)改動(dòng)。
當(dāng)然自己要先來測(cè)試一下嘍:
1 PottingFactory pottingfact = new PottingFactory(new RightComFactory()); 2 Component component= pottingfact.ComFactory.CreateComponent(); 3 component.Self_Described(); 4 component = pottingfact.ComFactory.CreateComponent2(); 5 component.Self_Described();
我們來看一下結(jié)果:
End IronMan之旅才剛剛開始
文章名稱:C#設(shè)計(jì)模式之工廠
分享鏈接:http://www.rwnh.cn/article6/jieeog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷、網(wǎng)站設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)