工厂方法模式

来源:互联网 发布:数据分析报告格式范文 编辑:程序博客网 时间:2024/05/11 20:34

1.       定义

           定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

2.      UML 类图

 

3.      结构代码

// Factory Method pattern -- Structural example

using System;

 

namespace DoFactory.GangOfFour.Factory.Structural

{

  ///<summary>

  /// MainApp startup class for Structural

  /// Factory Method Design Pattern.

  ///</summary>

  classMainApp

  {

    ///<summary>

    /// Entry point into console application.

    ///</summary>

    staticvoid Main()

    {

      // An array of creators

      Creator[] creators =new Creator[2];

 

      creators[0] = new ConcreteCreatorA();

      creators[1] = new ConcreteCreatorB();

 

      // Iterate over creators and create products

      foreach (Creator creatorin creators)

      {

        Product product = creator.FactoryMethod();

        Console.WriteLine("Created {0}",

          product.GetType().Name);

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  ///<summary>

  /// The 'Product' abstract class

  ///</summary>

  abstractclass Product

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classConcreteProductA : Product

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classConcreteProductB : Product

  {

  }

 

  ///<summary>

  /// The 'Creator' abstract class

  ///</summary>

  abstractclass Creator

  {

    publicabstract Product FactoryMethod();

  }

 

  ///<summary>

  /// A 'ConcreteCreator' class

  ///</summary>

  classConcreteCreatorA : Creator

  {

    publicoverride Product FactoryMethod()

    {

      returnnew ConcreteProductA();

    }

  }

 

  ///<summary>

  /// A 'ConcreteCreator' class

  ///</summary>

  classConcreteCreatorB : Creator

  {

    publicoverride Product FactoryMethod()

    {

      returnnew ConcreteProductB();

    }

  }

}


Output
Created ConcreteProductA
Created ConcreteProductB




4.      实例代码

// Factory Method pattern -- Real World example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Factory.RealWorld

{

  ///<summary>

  /// MainApp startup class for Real-World

  /// Factory Method Design Pattern.

  ///</summary>

  classMainApp

  {

    ///<summary>

    /// Entry point into console application.

    ///</summary>

    staticvoid Main()

    {

      // Note: constructors call Factory Method

      Document[] documents =new Document[2];

 

      documents[0] = new Resume();

      documents[1] = new Report();

 

      // Display document pages

      foreach (Document documentin documents)

      {

        Console.WriteLine("\n" + document.GetType().Name +"--");

        foreach (Page pagein document.Pages)

        {

          Console.WriteLine(" " + page.GetType().Name);

        }

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  ///<summary>

  /// The 'Product' abstract class

  ///</summary>

  abstractclass Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classSkillsPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classEducationPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classExperiencePage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classIntroductionPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classResultsPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classConclusionPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classSummaryPage : Page

  {

  }

 

  ///<summary>

  /// A 'ConcreteProduct' class

  ///</summary>

  classBibliographyPage : Page

  {

  }

 

  ///<summary>

  /// The 'Creator' abstract class

  ///</summary>

  abstractclass Document

  {

    privateList<Page> _pages =new List<Page>();

 

    // Constructor calls abstract Factory method

    public Document()

    {

      this.CreatePages();

    }

 

    publicList<Page> Pages

    {

      get {return _pages; }

    }

 

    // Factory Method

    publicabstract void CreatePages();

  }

 

  ///<summary>

  /// A 'ConcreteCreator' class

  ///</summary>

  classResume : Document

  {

    // Factory Method implementation

    publicoverride void CreatePages()

    {

      Pages.Add(newSkillsPage());

      Pages.Add(newEducationPage());

      Pages.Add(newExperiencePage());

    }

  }

 

  ///<summary>

  /// A 'ConcreteCreator' class

  ///</summary>

  classReport : Document

  {

    // Factory Method implementation

    publicoverride void CreatePages()

    {

      Pages.Add(newIntroductionPage());

      Pages.Add(newResultsPage());

      Pages.Add(newConclusionPage());

      Pages.Add(newSummaryPage());

      Pages.Add(newBibliographyPage());

    }

  }

}


Output
Resume -------
 SkillsPage
 EducationPage
 ExperiencePage

Report -------
 IntroductionPage
 ResultsPage
 ConclusionPage
 SummaryPage
 BibliographyPage


该文章来自:http://www.dofactory.com/Patterns/PatternFactory.aspx

原创粉丝点击