《大话设计模式》学习笔记——第1章——简单工厂模式

最近开始学习《大话设计模式》这本书,以每章一篇博客的形式把学习心得记录下来。代码部分使用的均为C#,开发工具是VS2013,我的代码可以在[我的GitHub](https://github.com/12301013-SunHaobo/DesignPatterns下载到

第1章——简单工程模式



    工厂是什么?就是批量生产东西的地方。

    在工厂模式里,我们向工厂类传入不同的参数,他就会返回不同的具体实现。

    以书中的计算器程序为例,最简单的写法当然是所有代码放一起,不使用任何设计模式,读两个数字和一个运算符,在switch语句里根据不同的运算符对两个数字进行不同的操作,最后输出结果。

    作为一个小黑框程序这样写就够了,但如果考虑一下程序的可复用性呢?比如如果要写一个有界面的计算器呢?在读这本书以前,我的做法肯定是把控制台的代码粘过去,然后把获取数字和运算符的方法从控制台读取修改成从界面获取,最后的输出改成调用界面控件显示,这样就完成了。

    但有一种明显更好的做法,就是把数据的获取和计算过程分离,把计算的过程封装成一个函数,接受两个数字和一个运算符作为参数并返回计算结果,然后对这个函数进行调用。那么这个函数就是可复用的。小黑框能用,界面程序也能用,甚至网页应用、手机应用也能直接拿去用。

    现在我们的计算器完成了,但如果要增加计算器的功能呢?比如要增加一个开平方的运算,怎么办。其实很简单啊,只要在计算函数的switch里增加一个分支就行了。这样做的后果就是,要增加一个功能,就必须**修改原有的代码**,而最好的情况是我们希望在给程序增加功能的时候,只需要增加实现新功能的代码,而不需要修改原有的部分。

    该怎么做呢?工厂模式闪亮登场。

    先来一个抽象类,成员变量有两个,数字A和数字B
public class Operation
{
    private double _numberB = 0;
    private double _numberA = 0;

    public double NumberA
    {
        get { return _numberA; }
        set { _numberA = value; }
    }
    public double NumberB
    {
        get { return _numberB; }
        set { _numberB = value; }
    }
    public virtual double GetResult()
    {
        return 0;
    }
}

    加法运算类的具体实现,继承了运算抽象类,重写GetResult方法:

class OperationAdd:Operation
{
    public override double GetResult()
    {
        return NumberA + NumberB;
    }
}

    其他三种基本运算的实现类跟加法类似,不再赘述。
    关键的工厂类:

public class OperationFactory
{
    public static Operation createOperation(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;
            default:
                throw new Exception("不支持的运算");
        }
        return oper;
    }
}

    主函数的代码:

static void Main(string[] args)
{
    Console.WriteLine("计算A+-*/B");
    Console.Write("输入数字A:");
    string strNumberA = Console.ReadLine();
    Console.Write("输入运算符:");
    string strOperate = Console.ReadLine();
    Console.Write("输入数字B:");
    string strNumberB = Console.ReadLine();

    Operation oper = OperationFactory.createOperation(strOperate);
    oper.NumberA = Convert.ToDouble(strNumberA);
    oper.NumberB = Convert.ToDouble(strNumberB);
    Console.WriteLine(oper.GetResult());
    Console.ReadLine();
}

    哈哈,工厂模式的计算器完成了。对这个计算器增加新运算时,就只要新增一个继承自抽象类的心运算类,并在其中重新GetResult方法就好了。

    可是,还是要修改工厂类啊?
    是这样的,但是不用修改已经实现好的其他运算类。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值