设计模式之工厂方法

工厂方法模式(Factory Method Pattern)属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
结构:


角色:

Creator:这个角色是工厂模式的核心,声明工厂方法,该方法返回一个Product类型的对象。它与应用程序无关。可以由接口或抽象类担任。
Concrete Creator:担任这个角色的类是实现了工厂接口(Creator)的具体类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建对象。
Product:工厂方法模式说创建的对象的父类型,也就是具体产品的共同接口。
ConcreteProduct:这个角色思想了抽象产品角色所声明的接口。工厂方法所创建的的每一个对象都是某个具体产品角色的实例。    
示例代码:
  
 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
    {
      get{ return 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 );
     }
   }
 }


工厂方法主要用于
1.隔离类对象的使用者和具体类型之间的耦合关系,面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
2.通过面向对象的手法,将创建具体对象的工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了这种紧耦合关系。
3.解决“单个对象”的需求变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值