乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      工廠方法模式(Factory Method Pattern)

       漂在北方的狼 2007-03-28

      一、 工廠方法(Factory Method)模式

      工廠方法(FactoryMethod)模式是類的創(chuàng)建模式,其用意是定義一個創(chuàng)建產品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中。

      工廠方法模式是簡單工廠模式的進一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。

      在工廠方法模式中,核心的工廠類不再負責所有產品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現(xiàn)的接口,而不接觸哪一個產品類被實例化這種細節(jié)。這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產品。

      在Factory Method模式中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。


      二、 Factory Method模式角色與結構:

       

      抽象工廠(Creator)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。

      具體工廠(Concrete Creator)角色:這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,并且受到應用程序調用以創(chuàng)建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。

      抽象產品(Product)角色:工廠方法模式所創(chuàng)建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。

      具體產品(Concrete Product)角色:這個角色實現(xiàn)了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創(chuàng)建,它們之間往往一一對應。


      三、 程序舉例:

       

      using System;

      public abstract   class Light
      {
         
      public abstract void TurnOn();
         
      public abstract void TurnOff();
      }


      public class BulbLight : Light
      {
         
      public override void TurnOn()
         
      { Console.WriteLine("Bulb Light is Turned on"); }

         
      public override void TurnOff()
         
      { Console.WriteLine("Bulb Light is Turned off"); }
      }


      public class TubeLight : Light
      {
         
      public override void TurnOn()
         
      { Console.WriteLine("Tube Light is Turned on"); }

         
      public override void TurnOff()
         
      { Console.WriteLine("Tube Light is Turned off"); }
      }


      public abstract   class Creator
      {
         
      public abstract Light factory();
      }


      public class BulbCreator : Creator
      {
         
      public override Light factory()
         
      return new BulbLight(); }
      }


      public class TubeCreator : Creator
      {
         
      public override Light factory()
         
      return new TubeLight(); }
      }


      public class Client
      {
         
      public static void Main()
         
      {
            Creator c1 
      = new BulbCreator();
            Creator c2 
      = new TubeCreator();

            Light l1 
      = c1.factory();
            Light l2 
      = c2.factory();

            l1.TurnOn();
            l1.TurnOff();

            Console.WriteLine(
      "-----------------");

            l2.TurnOn();
            l2.TurnOff();
         }

      }

       

      工廠方法的活動序列圖

       

      活動過程包括:

      客戶端創(chuàng)建BulbCreator對象,客戶端持有此對象的類型是Creator,而實際類型是BulbCreator。然后客戶端調用 BulbCreator的factory方法,之后BulbCreator調用BulbLight的構造函數(shù)創(chuàng)造出產品BulbLight對象。


      四、 工廠方法模式與簡單工廠模式

      工廠方法模式與簡單工廠模式再結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。

      工廠方法模式之所以有一個別名叫多態(tài)性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。

      當系統(tǒng)擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了"開放-封閉"原則。而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。

      工廠方法模式退化后可以演變成簡單工廠模式。


      五、 Factory Method模式演化

      使用接口或抽象類
      抽象工廠角色和抽象場頻角色都可以選擇由接口或抽象類實現(xiàn)。

      使用多個工廠方法
      抽象工廠角色可以規(guī)定出多于一個的工廠方法,從而使具體工廠角色實現(xiàn)這些不同的工廠方法,這些方法可以提供不同的商業(yè)邏輯,以滿足提供不同的產品對象的任務。

      產品的循環(huán)使用
      工廠方法總是調用產品類的構造函數(shù)以創(chuàng)建一個新的產品實例,然后將這個實例提供給客戶端。而在實際情形中,工廠方法所做的事情可以相當復雜。

      一個常見的復雜邏輯就是循環(huán)使用產品對象。工廠對象將已經創(chuàng)建過的產品登記到一個聚集中,然后根據(jù)客戶所請求的產品狀態(tài),向聚集查詢。如果有滿足要 求的產品對象,就直接將產品返回客戶端;如果聚集中沒有這樣的產品對象,那么就創(chuàng)建一個新的滿足要求的產品對象,然后將這個對象登記到聚集中,再返還給客 戶端。"享元模式(Flyweight Pattern)"就是這樣一個模式。

       

      多態(tài)性的喪失和模式的退化
      一個工廠方法模式的實現(xiàn)依賴于工廠角色和產品角色的多態(tài)性。在有些情況下,這個模式可以出現(xiàn)退化。

      工廠方法返回的類型應當是抽象類型,而不是具體類型。調用工廠方法的客戶端應當依賴抽象產品編程,而不是具體產品。如果工廠僅僅返回一個具體產品對象,便違背了工廠方法的用意,發(fā)生退化,這時就不再是工廠模式了。

      工廠的等級結構:工廠對象應當有一個抽象的超類型。如果等級結構中只有一個具體工廠類的話,抽象工廠就可以省略,發(fā)生了退化。


      六、 Factory Method模式與其它模式的關系

      與工廠方法模式有關的模式還包括:
      模板方法模式、MVC模式、享元模式、備忘錄模式


      七、 另外一個例子

       

      // Factory Method pattern -- Real World example  

      using System;
      using System.Collections;

      // "Product"
      abstract class Page
      {
      }


      // "ConcreteProduct"
      class SkillsPage : Page
      {
      }


      // "ConcreteProduct"
      class EducationPage : Page
      {
      }


      // "ConcreteProduct"
      class ExperiencePage : Page
      {
      }


      // "ConcreteProduct"
      class IntroductionPage : Page
      {
      }


      // "ConcreteProduct"
      class ResultsPage : Page
      {
      }


      // "ConcreteProduct"
      class ConclusionPage : Page
      {
      }


      // "ConcreteProduct"
      class SummaryPage : Page
      {
      }


      // "ConcreteProduct"
      class BibliographyPage : Page
      {
      }


      // "Creator"
      abstract class Document
      {
        
      // Fields
         protected ArrayList pages = new ArrayList();

        
      // Constructor
         public Document()
        
      {
          
      this.CreatePages();
        }


        
      // Properties
         public ArrayList Pages
        
      {
          
      getreturn pages; }
        }


        
      // Factory Method
         abstract public void CreatePages();
      }


      // "ConcreteCreator"
      class Resume : Document
      {
        
      // Factory Method implementation
         override public void CreatePages()
        
      {
          pages.Add( 
      new SkillsPage() );
          pages.Add( 
      new EducationPage() );
          pages.Add( 
      new ExperiencePage() );
        }

      }


      // "ConcreteCreator"
      class Report : Document
      {
        
      // Factory Method implementation
         override public void CreatePages()
        
      {
          pages.Add( 
      new IntroductionPage() );
          pages.Add( 
      new ResultsPage() );
          pages.Add( 
      new ConclusionPage() );
          pages.Add( 
      new SummaryPage() );
          pages.Add( 
      new BibliographyPage() );
        }

      }


      /// <summary>
      ///  FactoryMethodApp test
      /// </summary>

      class FactoryMethodApp
      {
        
      public static void Main( string[] args )
        
      {
          Document[] docs 
      = new Document[ 2 ];

          
      // Note: constructors call Factory Method
          docs[0= new Resume();
          docs[
      1= new Report();

          
      // Display document pages
           foreach( Document document in docs )
          
      {
            Console.WriteLine( 
      " " + document + " ------- " );
            
      foreach( Page page in document.Pages )
              Console.WriteLine( 
      " " + page );
          }

        }

      }

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多