学无止境,精益求精

十年河东,十年河西,莫欺少年穷

学历代表你的过去,能力代表你的现在,学习代表你的将来

大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代码无错就是优?简单工厂模式 C#

当然,本篇博客所讲的工厂模式和简单工厂模式还是非常类似的,因此,在进行工厂模式讲解之前,我们有必要重温下简单工厂模式

何为工厂模式?不论是简单工厂模式还是本篇的工厂模式,其工厂类主要负责生产对象,然后通过相应的对象调用相关的方法

在重温简单工厂模式之前,我们再次看下简单工厂模式的UML类图

大话设计模式之工厂模式  C#

针对上述的简单工厂模式UML类图,我们得到如下叙述:

1、简单工厂类是和运算类是有关联的(实线加箭头代表关联),简单工厂类的主要功能是生产运算对象

2、运算类用斜体表示,说明运算类为抽象类,运算类有两个属性及一个返回值为 double 的方法

3、加减乘除类继承运算类并实现GetResult()方法。

针对上述三点叙述,我们可用如下代码来实现(如果你还看不懂UML类图,可以参考鄙人博客:UML类图应该怎么看?

    public class 简单工厂类
    {
        double NumberA, NumberB;
        public 简单工厂类() { }
        public 简单工厂类(double A, double B)
        {
            this.NumberA = A;
            this.NumberB = B;
        }
        double Oper = new double();
        public double Operate(string 符号)
        {
            switch (符号)
            {
                case "+": Oper = new 加法类().GetResult(NumberA, NumberB); break;
                case "-": Oper = new 减法类().GetResult(NumberA, NumberB); break;
                case "*": Oper = new 乘法类().GetResult(NumberA, NumberB); break;
                case "/": Oper = new 除法类().GetResult(NumberA, NumberB); break;
            }
            return Oper;
        }
    }

    public abstract class 运算类
    {
        public abstract double GetResult(double NumberA, double NumberB);
    }

    public class 加法类:运算类
    {
        public override double GetResult(double NumberA, double NumberB)
        {
            return NumberA + NumberB;
        }
    }

    public class 减法类 : 运算类
    {
        public override double GetResult(double NumberA, double NumberB)
        {
            return NumberA - NumberB;
        }
    }

    public class 乘法类 : 运算类
    {
        public override double GetResult(double NumberA, double NumberB)
        {
            return NumberA * NumberB;
        }
    }

    public class 除法类 : 运算类
    {
        public override double GetResult(double NumberA, double NumberB)
        {
            if (NumberB != 0)
                return NumberA / NumberB;
            else throw new Exception("被除数不能为零");

        }
    }
View Code

相关文章: