一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

程序員上班路上實例解析三種工廠設(shè)計模式

 北書房2014 2017-02-11

  一、前言

  同樣在上班的路上,一個程序員想著是買梅干菜肉包還是買酸辣粉絲包,到了包子點 卻發(fā)現(xiàn)只有饅頭餡子的包子了,卻買了一包豆?jié){;一個程序員可能在在家吃完飯開車 去上班了,這尼瑪是富二代;一個程序員可能想著如何把自己的代碼如何優(yōu)化,如何 提高性能,如何的如何……上班路上的程序員讓你輕松了解三個設(shè)計模式。

  二、簡單工廠模式

  簡單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Met hod)模式,它屬于類創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同 類的實例。簡單工廠模式專門定義一個類來負(fù)責(zé)創(chuàng)建其他類的實例,被創(chuàng)建的實例通 常都具有共同的父類。簡單工廠模式就好比一個是一個富二代程序員,你要什么,簡 單工廠就給你什么。簡單工廠模式包括三個角色:抽象產(chǎn)品角色,具體產(chǎn)品角色,工 廠角色代碼實現(xiàn)如下: 

C#代碼
  1. //抽象產(chǎn)品角色:交通工具車    
  2. public abstract class Car    
  3. {  
  4.     public virtual void GoToWork()    
  5.     {    
  6.     }    
  7. }
  8. //具體產(chǎn)品角色:自行車    
  9. public class Bike : Car    
  10. {          
  11.     public override void GoToWork()    
  12.     {    
  13.         Console.WriteLine("騎自行車去上班");    
  14.     }    
  15. }    
  16. //具體產(chǎn)品角色:公交車    
  17. public class Bus : Car    
  18. {  
  19.     public override void GoToWork()    
  20.     {    
  21.         Console.WriteLine("做公交車去上班");    
  22.     }    
  23. }    
  24. //工廠角色:簡單工廠類    
  25. public class SimpleFactory    
  26. {  
  27.     public static Car CreateSimple(string str)    
  28.     {    
  29.         Car simple = null;  
  30.         switch (str)    
  31.         {  
  32.             case "Bike":    
  33.                 simple = new Bike();  
  34.                 break;  
  35.             case "Bus":    
  36.                 simple = new Bus();  
  37.                 break;  
  38.             //……   
  39.         }  
  40.         return simple;      
  41.     }    
  42. }    

  客戶端調(diào)用代碼:

C#代碼
  1. //根據(jù)客戶端傳入的參數(shù)簡單工廠決定如何去上班  
  2. Car car = SimpleFactory.CreateSimple("Bus");  
  3. car.GoToWork();  

  三、工廠方法模式

  工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式 。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù) 責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完 成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。工廠方法模式包括四 個角色:抽象產(chǎn)品角色,具體產(chǎn)品角色,抽象工廠角色,具體工廠角色具體示例代碼 實現(xiàn)如下:

C#代碼
  1. //抽象產(chǎn)品角色:交通工具車  
  2. public abstract class Car  
  3. {
  4.     public virtual void GoToWork()  
  5.     {  
  6.     }    
  7. }
  8. //具體產(chǎn)品角色:自行車  
  9. public class Bike : Car  
  10. {
  11.     public override void GoToWork()  
  12.     {  
  13.         Console.WriteLine("騎自行車去上班");  
  14.     }  
  15. }
  16. //具體產(chǎn)品角色:公交車  
  17. public class Bus : Car  
  18. {
  19.     public override void GoToWork()  
  20.     {  
  21.         Console.WriteLine("做公交車去上班");  
  22.     }  
  23. }
  24. //抽象工廠角色:工廠接口  
  25. public interface IFactory  
  26. {  
  27.     Car ByWhatWay();  
  28. }
  29. //具體工廠類:自行車類  
  30. public class BikeFactory : IFactory  
  31. {
  32.     public Car ByWhatWay()  
  33.     {
  34.          return new Bike();  
  35.     }  
  36. }
  37. //具體工廠類:公交車類  
  38. public class BusFactory : IFactory  
  39. {
  40.     public Car ByWhatWay()  
  41.     {
  42.          return new Bus();  
  43.     }    
  44. }  

  客戶端調(diào)用代碼:

C#代碼
  1. //根據(jù)客戶端實例化的工廠決定如何去上班  
  2. IFactory factory = new BusFactory();   
  3. //常規(guī)寫法            
  4. //反射優(yōu)化  (BusFactory)Assembly.Load("當(dāng)前程序集名稱").CreateInstance("當(dāng)前命名空間名稱.要實例化的類名")            
  5. //using System.Reflection; 引用命名空間            
  6. //var factoryName = "BusFactory";            
  7. //IFactory factory = (BusFactory) Assembly.Load("當(dāng)前程序集名稱").CreateInstance("當(dāng)前命名空間名稱." + factoryName);              
  8. Car car = factory.ByWhatWay();  
  9. car.GoToWork();  

  四、抽象工廠模式

  抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對 象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創(chuàng)建型 模式。抽象工廠模式包括四個角色:抽象產(chǎn)品角色,具體產(chǎn)品角色,抽象工廠角色, 具體工廠角色具體示例代碼如下:

C#代碼
  1. //抽象交通工具車  
  2. public abstract class Car  
  3. {        
  4.     //名字  
  5.     public string CarName{ get; set; }
  6.     public virtual string GoToWork()  
  7.     {
  8.         return CarName;  
  9.     }   
  10. }    
  11. //抽象早飯類  
  12. public abstract class BreakFast  
  13. {
  14.     //早飯名稱  
  15.     public string FoodName { get; set; }
  16.     public virtual string Eat()  
  17.     {
  18.         return FoodName;  
  19.     }  
  20. }
  21. //自行車  
  22. public class Bike : Car  
  23. {
  24.     public override string GoToWork()  
  25.     {  
  26.         CarName = "騎著自行車";            
  27.         return CarName;  
  28.     }  
  29. }    
  30. //公交車  
  31. public class Suv: Car  
  32. {
  33.     public override string GoToWork()  
  34.     {  
  35.         CarName = "開著SUV汽車";
  36.         return CarName;  
  37.     }  
  38. }    
  39. //高逼格早飯:三明治牛奶  
  40. public class SandWichAndMilk : BreakFast  
  41. {
  42.     public override string Eat()  
  43.     {  
  44.         FoodName = "三明治和牛奶";
  45.         return FoodName;  
  46.     }  
  47. }      
  48. //苦逼早飯:包子豆?jié){  
  49. public class BaoziAndDoujiang : BreakFast  
  50. {
  51.     public override string Eat()  
  52.     {  
  53.         FoodName = "包子豆?jié){";
  54.         return FoodName;  
  55.     }  
  56. }    
  57. //抽象工廠類  
  58. public abstract class AbstractFactory  
  59. {        
  60.     //創(chuàng)建交通工具方法  
  61.     public abstract Car CreatCar();        
  62.     //創(chuàng)建早飯方法  
  63.     public abstract BreakFast CreateBreakFast();  
  64.   
  65. }    
  66. //具體工廠類:苦逼程序員  
  67. public class LowFactory : AbstractFactory  
  68. {
  69.     public override Car CreatCar()  
  70.     {
  71.         return new Bike();  
  72.     }
  73.     public override BreakFast CreateBreakFast()  
  74.     {
  75.         return new BaoziAndDoujiang();  
  76.     }  
  77. }    
  78. //具體工廠類:高逼格程序員  
  79. public class HighFactory : AbstractFactory  
  80. {
  81.     public override Car CreatCar()  
  82.     {
  83.         return new Suv();  
  84.     }
  85.     public override BreakFast CreateBreakFast()  
  86.     {
  87.         return new SandWichAndMilk();  
  88.     }  
  89. }
  90. public class CoderLove  
  91. {
  92.     private Car car;
  93.     private BreakFast breakFast;
  94.     public CoderLove (AbstractFactory fac)  
  95.     {  
  96.         car=fac.CreatCar();  
  97.         breakFast=fac.CreateBreakFast();  
  98.     }
  99.     public void GetCoderLove()  
  100.     {  
  101.         Console.WriteLine("早飯吃完"+breakFast.Eat()+","+car.GoToWork()+"去上班");  
  102.     }  
  103. }  

  客戶端調(diào)用:

C#代碼
  1. AbstractFactory factory=new HighFactory();  
  2. CoderLove coder=new CoderLove(factory);  
  3. coder.GetCoderLove();  

  抽象工廠模式隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔 離,更換一個具體工廠就變得相對容易。所有的具體工廠都實現(xiàn)了抽象工 廠中定 義的那些公共接口,因此只需改變具體工廠的實例,就可以在某種程度上改變 整 個軟件系統(tǒng)的行為。除了以上苦逼程序員,高逼格程序員,還可以具體添加一個開 車SUV吃著包子豆?jié){的具體工廠,也可以添加騎著自行車吃著三明治牛奶的具體工廠 。

  五、總結(jié)

  1、這個三個模式都屬于對象創(chuàng)建型模式

  2、簡單工廠模式簡單的理解為客戶端告訴工廠他想要什么實例,工廠就給生產(chǎn)什么實 例

  3、工廠方法模式可以理解客戶端有了創(chuàng)建實例的機(jī)器,他想要什么實例就自己生產(chǎn)什 么實例

  4、抽象工廠模式最常見的情況是一套程序需要多套數(shù)據(jù)實現(xiàn)的情況下

  示例代碼下載:https:///cY8cctUs7pXSb (提取碼:157b)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    大胆裸体写真一区二区| 91亚洲人人在字幕国产| 久久99午夜福利视频| 国产又爽又猛又粗又色对黄| 欧美日韩中黄片免费看| 又色又爽又无遮挡的视频| 黄片美女在线免费观看| 欧美日韩亚洲精品在线观看| 婷婷九月在线中文字幕| 国产精品视频一区麻豆专区| 日韩成人动画在线观看| 日韩成人免费性生活视频| 国产中文另类天堂二区| 黄色国产自拍在线观看| 伊人国产精选免费观看在线视频| 我想看亚洲一级黄色录像| 亚洲中文字幕在线观看黑人| 亚洲熟妇熟女久久精品| 国产精品视频一区二区秋霞| 日韩欧美一区二区久久婷婷| 久热香蕉精品视频在线播放| 久久大香蕉一区二区三区| 国产无摭挡又爽又色又刺激| 亚洲少妇一区二区三区懂色| 激情综合五月开心久久| 女人精品内射国产99| 日本免费一级黄色录像| 日韩午夜福利高清在线观看| 国内精品一区二区欧美| 国产成人精品午夜福利| 免费高清欧美一区二区视频| 日韩欧美国产精品自拍| 国产户外勾引精品露出一区| 国产又长又粗又爽免费视频| 欧美六区视频在线观看| 日韩成人午夜福利免费视频| 欧洲一区二区三区自拍天堂| 国产免费人成视频尤物| 在线亚洲成人中文字幕高清| 欧美一级黄片免费视频| 在线一区二区免费的视频|