工厂模式

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();



注:以上主要内容来自“百度百科”和《大话设计模式》。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值