设计模式之( Factory Method Pattern--工厂方法模式)
2007-08-31 21:47
501 查看
定义:工厂方法又称工厂模式,也叫虚拟构造器(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.客户需要清楚创建了哪一个对象。
具体代码:
#region
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
简单的说:想象一种模型,假设有一种工具是由零件组合而成的,当我们用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.客户需要清楚创建了哪一个对象。
具体代码:
#region
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
相关文章推荐
- 设计模式2:Factory Method Pattern(工厂方法模式)
- 【设计模式】Factory Method Pattern——工厂方法模式
- 四.创建型设计模式——Factory Method Pattern(工厂方法模式)
- 23种设计模式之-----工厂方法模式(Method Factory pattern)
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
- C#设计模式-Factory Method Pattern
- java设计模式学习 ----- 工厂方法模式(Factory Method)
- java23种常用设计模式之工厂方法模式(Factory Method)
- 设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)
- 设计模式(Design Patterns)--工厂方法模式(Factory Method)
- C#设计模式之工厂模式(Factory)--02 工厂方法模式(Factory Method)
- C#设计模式(5)-Factory Method Pattern
- 温习C#设计模式之(二) 工厂方法模式(Factory Method)
- Java经典设计模式-创建型模式-工厂方法模式(Factory Method)
- 设计模式——工厂方法模式(FactoryMethod)和抽象工厂模式(Abstract Factory)
- 设计模式(5)-Factory Method Pattern
- C#设计模式(5)-Factory Method Pattern
- 设计模式(四)-工厂模式(Factory Method Pattern/Factory Pattern)——将实例的生成交给子类
- 设计模式之一---工厂方法模式【Factory Method模式】
- 设计模式——工厂方法模式(Factory Method)