📄 factorymethodrealworld.cs
字号:
using System;
using System.Windows.Forms;
using System.Collections;
//工厂方法模式(FactoryMethod)
//意图
// 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
//适用性
// 1.当一个类不知道它所必须创建的对象的类的时候。
// 2.当一个类希望由它的子类来指定它所创建的对象的时候。
// 3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
/************************************************************************
* 适用场景:
* 一、为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。
* 这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。当需要创建子类时出现问题:
* 1.客户程序员必须知道实际子类的名称;
* 2.程序的扩展性和维护变得越来越困难;
* 二、在父类中并不知道具体要实例化哪一个具体的子类;
*
* Factory模式的两个最重要的功能:
* 1. 定义创建对象的接口,封装了对象的创建 -- 声明一个创建对象的接口,并封装了对象的创建过程;
* 2. 使得具体化类的工作延迟到了子类中 -- 提供一个对象创建对象的接口,并在子类中提供其具体实现;
*
* 例如:
* 语义分析过程中,要为文法中的每个非终结符构造一个类处理,因此这个过程中对象的创建非常多,
* 采用Factory模式后系统可读性性和维护都变得容易许多。
* 问题:
* 1. 如果为每一个具体的 ConcreteProduct 类的实例化提供一个函数体,那么我们可能不得不在系统中添加
* 一个方法来处理这个新建的ConcreteProduct,这样Factory的接口永远就不肯能封闭(Close)。
* 当然我们可以通过创建一个Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。
* 2. 在实现中我们可以通过参数化工厂方法,即给FactoryMethod()传递一个参数(如模版)用以决定是创建具体哪一个具体的Product。
* 注意:
* Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),
* 如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。
*
************************************************************************/
namespace DesignPattern.FactoryMethodRealWorld
{
class FactoryMethodRealWorld : AbstractPattern
{
public static void Run(TextBox tbInfo)
{
s_tbInfo = tbInfo;
s_tbInfo.Text = "";
// 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)
{
DesignPattern.FormMain.OutputInfo("\n" + document.GetType().Name+ "--");
foreach (Page page in document.Pages)
{
DesignPattern.FormMain.OutputInfo(" " + page.GetType().Name);
}
}
// Wait for user
//Console.Read();
}
}
// "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
{
private ArrayList pages = new ArrayList();
// Constructor calls abstract Factory method
public Document()
{
this.CreatePages();
}
public ArrayList Pages
{
get
{
return pages;
}
}
// Factory Method
public abstract void CreatePages();
}
// "ConcreteCreator"
class Resume : Document
{
// Factory Method implementation
public override void CreatePages()
{
Pages.Add(new SkillsPage());
Pages.Add(new EducationPage());
Pages.Add(new ExperiencePage());
}
}
// "ConcreteCreator"
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());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -