工厂方法模式(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.解决“单个对象”的需求变化。