真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計模式系列-工廠方法模式

       回顧下設(shè)計模式系列《工廠模式》那片文章,里面描述了如何利用工廠模式來模擬一個換燈泡的場景,該場景中模擬了:普通燈泡、節(jié)能燈泡、彩色燈泡。它們統(tǒng)一由一個工廠(工廠類)來創(chuàng)造,我們需要使用哪種燈泡時,只需通知工廠類給我們打造一個相同的燈泡即可,類圖如下:

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元蘇家屯做網(wǎng)站,已為上家服務(wù),為蘇家屯各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

       設(shè)計模式系列-工廠方法模式

      由上面邊的類圖可見,所有類型的燈泡都由燈泡工廠來創(chuàng)建,那這個時候,制造燈泡的工廠因為企業(yè)擴大了,需要增加產(chǎn)量,那么此時一個工廠肯定是應(yīng)付不過來了,而且當前一個工廠所造的燈泡種類也多,更加加大了工廠的制造壓力,此時,企業(yè)擴建的最好辦法就是,增加工廠,各自工廠都只專注于一種燈泡的制造。

     1.工廠方法模式

     首先我們來看看什么是工廠方法模式:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。

     工廠方法模式類圖如下:

      設(shè)計模式系列-工廠方法模式

      Product:定義工廠方法所創(chuàng)建的對象的接口。相當于上邊場景中的燈泡抽象。

      ConcreteProduct:具體實現(xiàn)Product抽象的具體產(chǎn)品類。相當于上邊場景中的具體燈泡。

      Creator:聲明工廠方法,該方法返回一個Product類型的對象。

      ConcreteCreator:重定義工廠方法返回一個ConcreteProduct實例。

      可能這會大家看完這個類圖會有點模糊,不過沒關(guān)系,接下來我們利用工廠方法模式來實現(xiàn)我們上邊的場景(企業(yè)擴大需要建立更多的工廠)。

      首先,企業(yè)擴大了,需要增加產(chǎn)量建立更多的工廠來創(chuàng)建,為了更好的提高生產(chǎn)效率,每個工廠只專注于生產(chǎn)一種種類的燈泡,利用工廠方法模式設(shè)計的類圖如下:

      設(shè)計模式系列-工廠方法模式

      邊分析邊實現(xiàn)代碼:

      第一步,工廠擴大了,所造的產(chǎn)品還是燈泡,所以我們還是要把燈泡先抽象出來,為何要抽象請參考《工廠模式》這篇文章。

  1. //燈泡的約定   
  2. public interface IBulb    
  3. {    
  4.     //統(tǒng)一的發(fā)光接口   
  5.     public void Luminescence();    
  6. }  

      第二步,還是實現(xiàn)目前所有種類的具體燈泡類型。代碼如下:

  1. //燈泡   
  2. public class Bulb : IBulb//實現(xiàn)了燈泡的約定、標準  {       
  3.       //發(fā)光      
  4.        public void Luminescence()        
  5.       {           
  6.              //燈泡發(fā)光的實現(xiàn)       
  7.        }    
  8. }     
  9. //節(jié)能燈泡   
  10. public class FrugalBulb : IBulb //實現(xiàn)了燈泡的約定、標準   
  11. {        
  12.       //節(jié)能發(fā)光       
  13.       public void Luminescence()        
  14.      {            
  15.         //節(jié)能燈泡發(fā)光的實現(xiàn)       
  16.       }    
  17. }     
  18. //彩色燈泡   
  19. public class ColorBulb : IBulb    
  20. {        
  21.       //彩色發(fā)光       
  22.        public void Luminescence()        
  23.       {            
  24.             //彩色燈泡發(fā)光的實現(xiàn)       
  25.        }    
  26. }  
     第三步,因為增加了工廠,但是每個工廠都有一個共同的行為那就是制造燈泡,因此為了將來更方便的增加工廠,我們把工廠也抽象,代碼如下:
  1. //工廠的抽象 
  2. public interface IMyBulbFactory  
  3. {  
  4.     IBulb GetBulb();//將來每個工廠都有制造燈泡的行為 

     第四步,實現(xiàn)制造每個種類燈泡的具體工廠,每個工廠都只制造自己所造種類的燈泡,代碼如下:

  1. //制造普通燈泡的工廠 
  2.    public class BulbFactory : IMyBulbFactory  
  3.    {  
  4.        //該工廠制造燈泡的行為 只能制造普通燈泡 
  5.        public IBulb GetBulb()  
  6.        {  
  7.            return new Bulb();  
  8.        }  
  9.    }  
  10.  
  11.    //制造節(jié)能燈泡的工廠 
  12.    public class FrugalBulbFactroy : IMyBulbFactory  
  13.    {  
  14.        //該工廠制造燈泡的行為 只能制造節(jié)能燈泡 
  15.        public IBulb GetBulb()  
  16.        {  
  17.            return new FrugalBulb();  
  18.        }  
  19.    }  
  20.  
  21.    //制造節(jié)能燈泡的工廠 
  22.    public class ColorBulbFactroy : IMyBulbFactory  
  23.    {  
  24.        //該工廠制造燈泡的行為 只能制造彩色燈泡 
  25.        public IBulb GetBulb()  
  26.        {  
  27.            return new ColorBulb();  
  28.        }  
  29.    }  
     這樣,就滿足了企業(yè)擴大了,產(chǎn)量提高的問題了,需要什么樣的燈泡我們只需要到具體的工廠去獲取對應(yīng)的燈泡就可以啦,主函數(shù)調(diào)用如下:
  1.   static void Main(string[] args)  
  2.         {  
  3.             //需要普通燈泡 
  4.             IMyBulbFactory bulbFactory = new BulbFactory();  
  5.             IBulb bulb = bulbFactory.GetBulb();  
  6.             bulb.Luminescence(); //普通燈泡發(fā)光 
  7.  
  8.             //需要節(jié)能燈泡 
  9.             IMyBulbFactory frugalBulbFactroy = new FrugalBulbFactroy();  
  10.             IBulb frugalBulb = frugalBulbFactroy.GetBulb();  
  11.             frugalBulb.Luminescence(); //節(jié)能燈泡發(fā)光 
  12.  
  13.             //需要彩色燈泡 
  14.             IMyBulbFactory colorbulbFacroty = new ColorBulbFactroy();  
  15.             IBulb colorBulb = colorbulbFacroty.GetBulb();  
  16.             colorBulb.Luminescence(); //彩色燈泡發(fā)光 
  17. }  
          那么我們發(fā)現(xiàn),當工廠方法把具體產(chǎn)品的實例化延遲到具體的工廠類時,在客戶端調(diào)用的時候,我們必須顯示的制定使用哪個具體工廠類,這樣又加大了耦合度。     

     2.使用反射的工廠方法模式

      那么如何接觸上邊的耦合度呢?可以通過C#的反射機制,將當前所有工廠都配置到配置文件中,然后在配置一個當前需要使用的工廠節(jié)點,配置文件如下:

  1.  
  2.  
  3.      
  4.          
  5.          
  6.          
  7.          
  8.  
  9.          
  10.          
  11.      
  12.  

     這是我們還需要封裝一個專門提供具體工廠的類,為了方便這個類我就不考慮耦合了度。代碼如下:

  1. //用來提供當前需要使用的工廠 當前使用的工廠在配置文件中nonfactoty節(jié)點中配置 
  2.     public class FactroyProvider  
  3.     {  
  4.         public static IMyBulbFactory WhereToFactroy()  
  5.         {  
  6.             string fName = string.Empty;  
  7.             string factoryName = string.Empty;  
  8.             IMyBulbFactory factory = null;  
  9.               
  10.             if(!string.IsNullOrEmpty(ConfigurationManager.AppSettings["NonFactory"]))  
  11.             {  
  12.                 factoryName = ConfigurationManager.AppSettings["NonFactory"];  
  13.                 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[factoryName]))  
  14.                 {  
  15.                     fName = ConfigurationManager.AppSettings[factoryName];  
  16.                     factory = Assembly.Load("設(shè)計模式系列").CreateInstance(fName) as IMyBulbFactory;  
  17.                 }  
  18.             }  
  19.               
  20.             return factory;  
  21.         }  
  22.     }  
      通過反射找到工廠,我們將來如果又要擴大公司規(guī)模只需要增加具體的工廠實例與產(chǎn)品實例,在配置文件中配置一下即可。

     3.工廠方法模式與工廠模式的區(qū)別

     說道這里,不知道大家會不會有一個疑問,總之剛開始我是有這個疑問,疑問就是它和工廠模式的區(qū)別是什么呢?

     首先我們回顧下《工廠模式》中的工廠類的代碼,代碼如下:

  1. public class MyBulbFactory    
  2. {                    
  3.      public static IBulb GetBulb(string bulbName)        
  4.      {            
  5.           IBulb bulb = null;            
  6.           //告訴我你要什么燈泡,我制造相應(yīng)的燈泡給你           
  7.           switch (bulbName)            
  8.           {                
  9.                case "bulb":                    
  10.                bulb = new Bulb();                         
  11.                break;                                
  12.                case "frugalbulb":                    
  13.                bulb = new FrugalBulb();        
  14.                break;                    
  15.                case "colorbulb":    
  16.                   
  17.                 bulb = new ColorBulb();    
  18.                 break;            
  19.            }            
  20.        return bulb;        
  21.      }    
  22. }   
     可見將來我們?nèi)绻枰略鲆环N燈泡,需要修改上面的工廠類,在switch中加入一個對應(yīng)的case分支,這樣就違背了開放封閉原則,而工廠方法就是將這些產(chǎn)品類型的實例化延遲到具體的工廠類去實例化,這樣將來如果有了新產(chǎn)品就只需要去創(chuàng)建一個新的工廠類和一個具體的產(chǎn)品就可以了,也就是說工廠方法模式完善了簡單工廠模式,使它滿足了開放封閉原則。但是有個問題,就是客戶端每次調(diào)用的時候都會需要制定具體實例化哪個工廠類,例如:
  1. //需要普通燈泡 
  2.             IMyBulbFactory bulbFactory = new BulbFactory();//這里就制定了具體的工廠類 
  3.             IBulb bulb = bulbFactory.GetBulb();  
  4.             bulb.Luminescence(); //普通燈泡發(fā)光 

 這樣就增加了耦合性。我們在上面使用了反射類解除了耦合,但是又一個疑問出來啦,那么簡單工廠模式在創(chuàng)建產(chǎn)品類的時候,如果也使用反射的話那么將來在新增產(chǎn)品的時候也就不需要修改工廠類的代碼了,也就是說簡單工廠模式使用反射一樣可以完美的解決開放封閉原則的問題!

      那么新的問題又出來了,那簡單工廠模式還有什么作用呢?

      我個人有兩種理解的方式,僅代表個人觀點,也希望大家都詳細的說說自己的觀點,不要一句話概括噢~!

      第一種、在早期設(shè)計模式應(yīng)用的時候,編程語言還沒有使用反射的機制時,使用工廠方法模式來升級簡單工廠模式,使能夠支持開放封閉原則。

      第二種、在特殊場景中,工廠方法模式能更好的實現(xiàn)邏輯的組織,例如本篇文章所使用的場景。


分享文章:設(shè)計模式系列-工廠方法模式
文章鏈接:http://weahome.cn/article/pdgcsg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部