简单工厂和工厂方法的区别
在《简单工厂模式和策略模式的区别》中说道简单工厂中用一个Factory类来专门负责产生具体的类,在添加一个功能的时候要做两个动作,一是添加一个FunctionC类继承自Function类,二是要修改Factory类的CreateObject方法。
代码如下:
{
public static Function CreateObject(string condition)
{
Function ft = null;
switch condition:
case conditionA:
{
ft = new FunctionA();
break;
}
case conditionB:
{
ft = new FunctionB();
break;
}
case conditionC: //修改了CreateObject方法
{
ft = new FunctionC();
break;
}
default:
break;
}
}
public calss Function
{
public virtual void DoSomething()
{
.... ....
}
}
public class FunctionA:Function
{
public void override DoSomething()
{
.... ...
}
}
public calss FuctionB:Function
{
public void override DoSomething()
{
.... ....
}
}
//扩展一个新的类
public calss FuctionC:Function
{
public void override DoSomething()
{
.... ....
}
}
public static void main()
{
string condition = "asdfasdf";
Function fc = Factory.CreateObject(condition);
fc.DoSomething();
}
这样看起来也很方便,但是软件设计里面有个原则开放封闭原则,对于扩展开放,对于修改封闭。这里修改了CreateObject()方法,做项目的时候发现只要修改就会有可能出错误,可能就是这个道理吧。这样就诞生了工厂方法模式。
工厂方法模式省去了原来的Factory类,不用这个类来生产对象,但是使用一系列的工厂类来专门负责产生相应的类。在客户端要想使用这个功能类,首先要获得它的工厂类,由这个工厂类来产生相应的功能类。这样添加一个功能的时候也要做两个工作,一是添加相应的功能类,二是添加一个工厂类。工厂方法模式定义一个用于创建对象的工厂接口IFactory,让这个接口的子类FactoryA,FactoryB决定实例化具体的功能类,而不是想简单工厂中那样直接在工厂类Factory中决定。
工厂方法代码如下:
{
Function CreateFunction(); //工厂接口的功能:产生功能类
}
class FactoryA:IFactory
{
public override CreateFunction()
{
return new FunctionA();
}
}
class FactoryB:IFactory
{
public override CreateFunction()
{
return new FunctionB();
}
}
//去掉原来的工厂类
public calss Function
{
public virtual void DoSomething()
{
.... ....
}
}
public class FunctionA:Function
{
public void override DoSomething()
{
.... ...
}
}
public calss FuctionB:Function
{
public void override DoSomething()
{
.... ....
}
}
public static void main()
{
IFactory ifactory = new FactoryA(); //根据要实例化的功能类选择工厂类
FunctionA fa = ifactory.CreateFunction();//工厂类实例化具体的功能类
fa.DoSomething();
}
简单工厂类也可以实现这样的功能,就是要修改原来的Factory类,在工厂方法模式里面要添加一个功能,需要扩展一个FuctionB:Function,还要扩展一个FactoryB:IFactory,避免了修改,开放了扩展。
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火