在简单工厂模式中,一个工厂处于对产品类进行实例化的中心位置,他知道每一个产品类的细节,并决定何时哪一个产品类应当被实例化。简单工厂模式的优点是能够使客户端独立于产品的创建过程,并且在系统中引入新产品时无需对客户端进行修改,缺点是当有新产品加入到系统中的时,必须修改工厂类,以加入必要的处理逻辑。简单工厂模式的致命弱点就是处于核心地位的工程类,因为一旦他无法确定要对那个类进行实例化,就无法使用该模式,而工厂方法模式则可以很好的解决这个问题。
简单方法模式可分为:
(1)Product:产品角色 在我们c#中一般使用抽象类和接口实现
定义产品的接口
(2)CreateProduct:真实的产品
实现接口Product类 这个类一般是继承产品角色的类,而且对里面生成产品的方法进行重写。
(3)Creator:工厂角色
声明工厂角色(FactorMethod) 这个是简单工厂模式的核心类,此处一般为抽象类,抽象工厂,表示出生成何种实例化的产品,具体的实例化类须需要的是真实的工程去进行实例。
(4)ConcreteCreator:真实的工厂
这个是工厂方法的具体实现,一般继承与工厂角色的抽象类,实现具体的实例化。
案例:
大学毕业时对个人的能力进行分析时,可以这样的去分析,一个人的教育背景,所学课程,结业成绩等这些是所有毕业生所具有的共同的属性,而这其中个人所获得的技能证书,奖项等分人而论,所以综上的分析,所有的技能继承于一个类pages类,而当我们实例化时所要区分技能由抽象工厂来区分。
如下:
//这个是工厂方法模式,
namespace MultiPage
{
//产品的基类,(抽象产品角色)
abstract class Page
{
}
//这个是生产产品的工厂 (抽象工厂角色)
abstract class Document
{
protected ArrayList pages = new ArrayList();
//这个是页面的列表
public Document()
{
this.CreatePages();
}
public ArrayList Pages
{
get { return pages; }
}
//抽象方法
此方法在派生类中重写此方法
abstract public void CreatePages();
}
//派生类具体产品类——技能页 (具体产品角色)
class Skillspage : Page
{
}
//派生产品类——教育页 (具体的产品角色)
class EducationPage : Page
{
}
//派生产品类——介绍页 (具体产品角色)
class IntroductionPage : Page
{
}
//派生结果类 (具体产品角色)
class ResultPage : Page
{
}
//具体工厂类一个人简历,包括技能,教育,经验 (具体工厂角色)
class Resume : Document
{
//工厂方法的具体实现 这里边是对页面的重写
public override void CreatePages()
{
pages.Add(new Skillspage());
pages.Add(new EducationPage());
//throw new NotImplementedException();
}
}
//具体工厂类——个人报告,结果,结论,总结,文献 (具体工厂2角色)
class Report : Document
{
public override void CreatePages()
{
pages.Add(new IntroductionPage());
pages.Add(new ResultPage());
}
}
}
但我们应用时可创建不同类的实例:
static void Main(string[] args)
{
Document[] docs = new Document[2]; //在构造函数调用了Factory Method,创建两种文档
docs [0]=new Resume ();
docs [1]=new Report (); //显示文档的内容
foreach (Document document in docs )
{
Console .WriteLine ("\n"+document +"————————————————");
foreach (Page page in document .Pages )
Console .WriteLine (" "+page );
}
Console .Read ();
}