1.开闭原则
开闭原则:Software entities should be open for extension,but closed for modification(出自勃兰特·梅耶的著作《面向对象软件构造(Object Oriented Software Construction)》一书)。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。
也就是说,在现有的系统之上引进新的功能的时候,不应该修改现有代码(闭)。在不修改现有代码的前提上,通过添加新的代码,能够增加新的功能(开)。
2.再来分析简单工厂模式
先来看看简单工厂模式的例子(上一节),实现求A?B的值,?是某一种运算符(+-×/)。
public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper=null;
switch(operate)
{
case "+":
oper=new OperationAdd();
break;
case "-":
oper=new OperationSub();
break;
case "*":
oper=new OperationMul();
break;
case "/":
oper=new OperationDiv();
break;
}
return oper;
}
}
客户端代码
Operation oper;
oper=OperationFactory.createOperate("+");
oper.numA=1;
oper.numB=2;
double result=oper.GetResult();
如果现在要添加一种新的运算符,比如mod。那么必须修改OperationFactory。这与开闭原则不相符。这里,我们可以看到,在简单工厂中操作符类的实例化是在工厂类中完成的。如果添加一个新的操作符类,必须修改这个工厂类。我们必须想办法让类的实例化在客户端中完成。
3.工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
4.工厂模式结构图(图片来自网络)
5.例子
interface IFactory
{
Operation CreateOperation();
}
class AddFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
客户端的实现:
IFactory operFactory =new AddFactory();
Operation oper=operFactory.CreateOperation();
oper.numA=1;
oper.numB=2;
double result=oper.GetResult();
分析:在工厂模式中,添加一个新的操作符,不需要修改原有的代码,只需要添加操作符类和相应的工厂类。比如添加mod。
class ModFactory: IFactory
{
public Operation CreateOperation()
{
return new OperationMod();
}
}
class OperationMod: Operation
{
...
}
客户端:
IFactory operFactory =new ModFactory();
Operation oper=operFactory.CreateOperation();
oper.numA=1;
oper.numB=2;
double result=oper.GetResult();
注:以上主要内容来自“百度百科”和《大话设计模式》。