当前位置:编程学习 > C#/ASP.NET >>

关于简单工厂模式(简单计算器例子)的讨论

下面两段代码第一段是我写的,第二段是书上写的。我有点不明白,第二段比第一段代码好在哪里,第一段有啥不足之处。


第一段代码:


public class SimpleFactory
    {
        public decimal CalResult(decimal number1, decimal number2, string operatorName)
        {
            decimal result = 0;
            switch (operatorName)
            {
                case "+":
                    result = CalAdd(number1, number2);
                    break;
                case "-":
                    result = CalSubtraction(number1, number2);
                    break;
                case "*":
                    result = CalMultiplicative(number1, number2);
                    break;
                case "/":
                    result = CalDivision(number1, number2);
                    break;
            }
         
            return result;
        }

        public decimal CalAdd(decimal number1, decimal number2)
        {
            decimal result = 0;
            result = number1 + number2;
            return result;
        }
        public decimal CalSubtraction(decimal number1, decimal number2)
        {
            decimal result = 0;
            result = number1 - number2;
            return result;
        }

        public decimal CalMultiplicative(decimal number1, decimal number2)
        {
            decimal result = 0;
            result = number1 * number2;
            return result;
        }
        public decimal CalDivision(decimal number1, decimal number2)
        {
            if (number2 == 0)
            {
                throw new Exception("除数不能为0。");
            }
            decimal result = 0;
            result = number1 / number2;
            return result;
        }
    }


第二段代码:



  class Operation
    {
        private decimal _numberA = 0;
        private decimal _numberB = 0;

        public decimal numberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public decimal numberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual decimal GetResult()
        {
            decimal result = 0;
            return result;
        }
    }

    class OperationAdd : Operation
    {
        public override decimal GetResult()
        {
            decimal result = 0;
            result = numberA + numberB;
            return result;
        }
    }
    class OperationSub : Operation
    {
        public override decimal GetResult()
        {
            decimal result = 0;
            result = numberA - numberB;
            return result;
        }
    }
    class OperationMul : Operation
    {
        public override decimal GetResult()
        {
            decimal result = 0;
            result = numberA * numberB;
            return result;
        }
    }

    class OperationDiv : Operation
    {
        public override decimal GetResult()
        {
            decimal result = 0;
            if (numberB == 0)
            {
                throw new Exception("除数不能为0。");
            }
            result = numberA / numberB;
            return result;
        }
    }

    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;
        }
    }
简单工厂模式 类 --------------------编程问答-------------------- 这个例子只是想告诉你工厂模式的概念大体是什么。但是单从这个例子来讲,用工厂模式完全是不必要和浪费时间以及加大工作量,所以你有疑问也是正常的。在实际项目中,多数情况下我们不会写一个如此简单的计算器,即使写,也不会运用工厂模式。 --------------------编程问答-------------------- 我的个人理解是,第一种方法,仅仅利用了面向对象的封装,对于继承和多态并没有用到。
第二种方法全都用到了。 --------------------编程问答--------------------
引用 2 楼 chuanzhang5687 的回复:
我的个人理解是,第一种方法,仅仅利用了面向对象的封装,对于继承和多态并没有用到。
第二种方法全都用到了。

这只是其中一个。
另外,第二种这张扩展性更好一点,假如现在我要增加一个求模,
第一个还得去修改CalResult,
而第二种,就不必去修改Operation类了
--------------------编程问答--------------------
引用 1 楼 ktei2008 的回复:
这个例子只是想告诉你工厂模式的概念大体是什么。但是单从这个例子来讲,用工厂模式完全是不必要和浪费时间以及加大工作量,所以你有疑问也是正常的。在实际项目中,多数情况下我们不会写一个如此简单的计算器,即使写,也不会运用工厂模式。


嗯,确实是这样,从这个例子中,我也简单的理解了 简单工厂模式。
对我这个小例子来说,工作量还不是很大,遇到复杂一点的需求,这种模式确实会加大很多工作量。
貌似又看到了一点,将来维护起来,会方便一点哈。 --------------------编程问答--------------------
引用 3 楼 Chinajiyong 的回复:
引用 2 楼 chuanzhang5687 的回复:我的个人理解是,第一种方法,仅仅利用了面向对象的封装,对于继承和多态并没有用到。
第二种方法全都用到了。
这只是其中一个。
另外,第二种这张扩展性更好一点,假如现在我要增加一个求模,
第一个还得去修改CalResult,
而第二种,就不必去修改Operation类了


嗯,是有这么一点,修改起来更清晰一点。

有点疑问哈,
两种方法都加一个求模的话,
都得修改两个地方,一个是加方法,一个是加类,
而且都得从操作方法中添加 求模的swich --------------------编程问答-------------------- 这样的话,第二种的修改方法比第一种的方法好在哪呢?
工作量的话 都差不多
就好在第二种方法没有修改Operation类吗 --------------------编程问答-------------------- 是在大话模式上看的吗,后面还有几个例子,再看看会理解地比较深 --------------------编程问答--------------------
引用 7 楼 chb345536638 的回复:
是在大话模式上看的吗,后面还有几个例子,再看看会理解地比较深

嗯,好的,继续往下看。 --------------------编程问答-------------------- 个人认为第二中代码的可扩展性好点
对于新引入的operation直接继承即可
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,