定义:工厂方法又称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。
简单的说:想象一种模型,假设有一种工具是由零件组合而成的,当我们用1方式合成这种工具时候,它可以被A,B,C。。使用;用2方式合成这种工具时候,它可以被B,C,D。。使用;等等;但A,B。。具有相同的特征(从分类角度看书属于同意类型)。这里的工具就可以当作是抽象工厂,1方式和2方式的工具可以看作是具体的工厂,
文字描述实际案例:多文档系统。文档是有多种Page组成,具体Page包括SkillPage(技能页面),EducationPage(报表页),IntroductionPage(介绍页)等等,都具有Page类型特性,而Document(文档)是一个抽象类,它可以派生出具体的多种形式的文档,如Resume个人简历(包含SkillPage,EducationPage等),Report报告(包含IntroductionPage等)
优缺点:优:建立客户所需要的产品,同时象客户向客户隐藏了具体产品类将被实例化这个细节,在系统加入新产品类的时候,无需修改抽象工厂和抽象产品所提供的接口,无需修改客户端,只要添加一个具体的工厂和具体的产品就可以了。缺:在添加新产品时候,需要编写新的具体产品类,还要提供与之对应的具体工厂类,当两者都比较简单时,系统会有相对额外的开销。
应用情景:1.类不知道自己要创建哪一个对象。2.类用它的子类来指定创建哪一个对象。3.客户需要清楚创建了哪一个对象。
具体代码:
using System;
using System.Collections;
namespace MultiPage
{
#region
// 产品基类
abstract class Page
{ }
#endregion
#region
// 工厂抽象类
abstract class Document
{
ArrayList pages = new ArrayList();
public Document()
{
this .CreatePages();
}
public ArrayList Pages
{
get { return pages; }
}
// Factory Method
abstract public void CreatePages();
}
#endregion
#region
// 派生类,具体产品类--技能页
class SkillPage : Page
{ }
// 派生类,具体产品类--教育页
class EductionPage : Page
{ }
// 派生类,具体产品类--经验页
class ExperiencePage : Page
{ }
// 派生类,具体产品类--介绍页
class IntroductionPage : Page
{ }
// 派生类,具体产品类--结果页
class ResultPage : Page
{ }
// 派生类,具体产品类--结论页
class ConclusionPage : Page
{ }
// 派生类,具体产品类--总结页
class SummaryPage : Page
{ }
// 派生类,具体产品类--文献页
class BibliographyPage : Page
{ }
#endregion
#region
// 具体工厂类--个人简历,包含技能,教育,经验
class Resume : Document
{
// Factory Method 实现
override public void CreatePages()
{
pages.Add( new SkillsPage());
pages.Add( new EducationPage());
pages.Add( new ExperiencePage());
}
}
#endregion
#region
// 具体产品类--报告,包括介绍,结果,结论,总结,文献
class Report:Document
{
public override void CreatePages()
{
pages.Add( new IntroductionPage());
pages.Add( new ResultPage());
pages.Add( new ConclusionPage());
pages.Add( new SummaryPage());
pages.Add( new BibliographyPage());
}
}
#endregion
#region
/// <summary>
/// 客户测试程序
/// </summary>
class Client
{
static void Main()
{
Document[] docs = new Document[ 2 ];
docs[ 0 ] = new Resume();
docs[ 1 ] = new Report();
// 显示文档内容
foreach (Document document in docs)
{
Console.WriteLine( " " + document + " ----------- " );
foreach (Page page in document.Pages)
{
Console.WriteLine( " " + page);
}
}
Console.Read();
}
}
#endregion
}
#endregion