程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 工廠方法模式

工廠方法模式

編輯:C#入門知識

    工廠方法(FactoryMethod)模式:是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。也就是說核心工廠類不再負責產品的創建,僅負責具體工廠子類必須實現的接口就行。這樣抽象的好處是顯而易見的,我們不再需要去修改具體工廠的角色了。           例如下面的代碼:是一個即將畢業的大學生,以學雷鋒做好事的名義去幫助一位老人:   [csharp]    //雷鋒類   class LeiFeng   {       public void Sweep()       {           Console.WriteLine("掃地");       }          public void Wash()       {           Console.WriteLine("洗衣");       }          public void BuyRice()       {           Console.WriteLine("買米");       }   }      //“學雷鋒的大學生”類,繼承雷鋒   class UnderGraduate : LeiFeng   {   }   //客戶端代碼   static void Main(string[] args)   {       LeiFeng xueleifeng = new UnderGraduate();          xueleifeng.Wash();       xueleifeng.Sweep();       xueleifeng.BuyRice();   }            現在如果添加人數,例如共3位同學做這些事,那麼只需要實例化三個“學雷鋒的大學生”對象了:   [csharp]   //客戶端代碼      static void Main(string[] args)      {          LeiFeng student1 = newUnderGraduate();          student1.Wash();          LeiFeng student2 = newUnderGraduate();          student2.Sweep();          LeiFeng studen3 = newUnderGraduate();          studen3.BuyRice();      }            這時候就有人有異議了,難道只能大學生去學雷鋒做好事嗎?我們中學生也可以盡一己之力的。於是,這時候就不是單單實例化多個對象的問題了。           於是雷鋒工廠就來了。   [csharp]    //雷鋒工廠      interface Ifactory      {          LeiFeng CreateLeiFeng();      }            //“學雷鋒的大學生”工廠      class UnderGraduateFactory : Ifactory       {          public LeiFeng CreateLeiFeng()          {              return new UnderGraduate() ;          }      }            //“學雷鋒的中學生”工廠      class  MiddleStudentFactory : Ifactory      {          public LeiFeng CreateLeiFeng()          {              return new MiddleStudent();          }      }            客戶端調用的時候只需要這樣就可以了:   [csharp]    //客戶端代碼      static void Main(string[] args)      {          //工廠方法模式          Ifactory factory = newUnderGraduateFactory();   //要換成“中學生”,修改這裡就行          LeiFeng student =factory.CreateLeiFeng();                student.BuyRice();          student.Wash();          student.Sweep();      }            這時候怎麼樣,想換成中學生還不容易嗎?           通過以上的代碼,我們可以看到,工廠方法克服了簡單工廠違背“開放-封閉原則”的缺點,又保持了封裝對象創建過程的優點,降低了客戶程序與產品對象的耦合。可以說工廠方法模式是簡單工廠模式的進一步抽象和推廣。           可是有一個問題,當我們每增加一個產品時,都需要加一個產品工廠的類,很顯然會增加額外的開發量,那該怎麼辦呢?這又要說到-“反射”了。不過此篇博客不會細講,在以後的抽象工廠模式中會有詳解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved