第一天 - 简单工厂模式 笔记

两本书是否涉及?

简单工厂模式为大话设计模式第一章的内容,而在设计模式一书中没有。

书中例子

面试题——实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

第一反应:如果不了解设计模式的话,肯定会使用switch…case来编写程序

 class Program {
        static void Main(string[] args) {
            try {
                //省略输入的过程
                switch (operate) {
                    case "+":
                        result = (numberA + numberB).ToString();
                        break;
                    ...............
                    case "/":
                        if (numberB == 0)
                            result = "除数不为0";
                        else
                            result = (numberA / numberB).ToString();
                        break; }
                Console.WriteLine("结果是:" + result);
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

问题:将整段的代码都写在主函数中,没有使用到面向对象的概念

第二次改进:写一个Operation类实现业务逻辑和界面逻辑相分离

class Operate{
        static float result = 0f;
        public static float GetResult(float numberA,float numberB,string operate) {
            switch (operate) {
                case "+":
                    result = numberA + numberB;
                    break;
               ..............
                case "/":
                    result = numberA / numberB;
                    break;
            }
            return result;
        }
    }
class Program{
        static void Main(string[] args){
            try {
                //省略输入的过程
                float result = Operate.GetResult(numberA, numberB, operate);
                Console.WriteLine("结果是:" + result);
            }
            catch (Exception ex){
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

问题:仅相当于将switch…case结构放到了Operate类中,如果需要添加其他的运算时,还是需要修改Operate类中的方法,不符合封闭原则。

第三次改进:使用简单工厂模式

    class OperationFactory
    {
        public static Operation CreateOperation(string operate)
        {
            Operation o = null;
            switch (operate)
            {
                case "+":
                    o = new OperationAdd();
                    break;
                case "-":
                    o = new OperationSub();
                    break;
            }
            return o;
        }
    }
class Operation
    {
        public float NumberA { get; set; }
        public float NumberB { get; set; }

        public virtual float GetResult()
        {
            return 0;
        }
    }
 class OperationAdd:Operation
    {
        public override float GetResult()
        {
            return NumberA+NumberB;
        }
    }
//减、乘、除类似
class Program
    {
        static void Main(string[] args)
        {
            Operation o;
            o = OperationFactory.CreateOperation("+");
            o.NumberA = 4;
            o.NumberB = 5;
            Console.WriteLine(o.GetResult());
            Console.ReadLine();
        }
    }

优势:如果需要添加新的运算,只需要添加Operation的子类,以及对OperationFactory的switch…case做调整就可以了。
缺点:还是没有去除switch…case语句,修改时还是要去修改OperationFactory类。

UML类图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值