工厂方法模式

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>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void 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 creator in creators)

      {

        Product product = creator.FactoryMethod();

        Console.WriteLine("Created {0}",

          product.GetType().Name);

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Product' abstract class

  /// </summary>

  abstract class Product

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConcreteProductA : Product

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConcreteProductB : Product

  {

  }

 

  /// <summary>

  /// The 'Creator' abstract class

  /// </summary>

  abstract class Creator

  {

    public abstract Product FactoryMethod();

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class ConcreteCreatorA : Creator

  {

    public override Product FactoryMethod()

    {

      return new ConcreteProductA();

    }

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class ConcreteCreatorB : Creator

  {

    public override Product FactoryMethod()

    {

      return new 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>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      // Note: constructors call Factory Method

      Document[] documents = new Document[2];

 

      documents[0] = new Resume();

      documents[1] = new Report();

 

      // Display document pages

      foreach (Document document in documents)

      {

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

        foreach (Page page in document.Pages)

        {

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

        }

      }

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Product' abstract class

  /// </summary>

  abstract class Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class SkillsPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class EducationPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ExperiencePage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class IntroductionPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ResultsPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class ConclusionPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class SummaryPage : Page

  {

  }

 

  /// <summary>

  /// A 'ConcreteProduct' class

  /// </summary>

  class BibliographyPage : Page

  {

  }

 

  /// <summary>

  /// The 'Creator' abstract class

  /// </summary>

  abstract class Document

  {

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

 

    // Constructor calls abstract Factory method

    public Document()

    {

      this.CreatePages();

    }

 

    public List<Page> Pages

    {

      get { return _pages; }

    }

 

    // Factory Method

    public abstract void CreatePages();

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class Resume : Document

  {

    // Factory Method implementation

    public override void CreatePages()

    {

      Pages.Add(new SkillsPage());

      Pages.Add(new EducationPage());

      Pages.Add(new ExperiencePage());

    }

  }

 

  /// <summary>

  /// A 'ConcreteCreator' class

  /// </summary>

  class Report : Document

  {

    // Factory Method implementation

    public override void CreatePages()

    {

      Pages.Add(new IntroductionPage());

      Pages.Add(new ResultsPage());

      Pages.Add(new ConclusionPage());

      Pages.Add(new SummaryPage());

      Pages.Add(new BibliographyPage());

    }

  }

}


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

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值