[设计模式] 简单工厂(Simple Factory)

[设计模式] 简单工厂(Simple Factory)


Introduction

(原文出处 大话设计模式 )

大部分的人对于面向对象都有一些了解,利用面向对象的特性(封装、继承、多态) 来写出容易扩充、维护与高重用性的程序,

如同书上介绍的,我想设计模式只是利用面向对象的特性,让我们去找到“封装变化”、“对象间松散的耦合”、“针对界面程序设计”

的感觉,而达到最终的目的。这是个心得笔记。

Example

写出一个简单计算机功能的程序,并且这个程序,可以移植到任何的应用程序(ex:Web、PDA、Window)。

先设计一个  Operation 抽象类作为基底。


 /// 
    /// 运算类
    /// 
    public abstract class Operation {
        private double _numberA = 0;
        private double _numberB = 0;

        /// 
        /// 数字A
        /// 
        public double NumberA {
            get {
                return _numberA;
            }
            set {
                _numberA = value;
            }
        }

        /// 
        /// 数字B
        /// 
        public double NumberB {
            get {
                return _numberB;
            }
            set {
                _numberB = value;
            }
        }

        /// 
        /// 得到运算结果
        /// 
        /// 
        public virtual double GetResult() {
            double result = 0;
            return result;
        }
}

再来撰写计算的功能(加法、乘法...),复写 GetResult() 函数(属于自己的计算结果)。


 /// 
    /// 加法类
    /// 
    class OperationAdd : Operation {
        public override double GetResult() {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    /// 
    /// 减法类
    /// 
    class OperationSub : Operation {
        public override double GetResult() {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

    /// 
    /// 乘法类
    /// 
    class OperationMul : Operation {
        public override double GetResult() {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

    /// 
    /// 除法类
    /// 
    class OperationDiv : Operation {
        public override double GetResult() {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0。");
            result = NumberA / NumberB;
            return result;
        }
    }

撰写简单工厂类,负责实例化要运算的类(利用多态的技巧)。


/// 
    /// 运算类工厂
    /// 
    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;
                    }
                case "sqr": {
                        oper = new OperationSqr();
                        break;
                    }
                case "sqrt": {
                        oper = new OperationSqrt();
                        break;
                    }
                case "+/-": {
                        oper = new OperationReverse();
                        break;
                    }
            }

            return oper;
        }
    }

最后就是 Client 端的程序。


        static void Main(string[] args) {
            try {
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();
                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();
                Console.Write("请输入数字B:");
                string strNumberB = Console.ReadLine();
                string strResult = "";

                Operation oper;
                oper = OperationFactory.createOperate(strOperate);
                oper.NumberA = Convert.ToDouble(strNumberA);
                oper.NumberB = Convert.ToDouble(strNumberB);
                strResult = oper.GetResult().ToString();

                Console.WriteLine("结果是:" + strResult);

                Console.ReadLine();
            }
            catch (Exception ex) {
                Console.WriteLine("您的输入有错:" + ex.Message);
            }
        }

输出结果

2010-02-05_013613

这个方法切割了界面与算法,并且依照需求产生相对应的对象,这就是简单工厂的好处;

若是要扩充运算类或是修改,也只需针对算法这一块,当然,对于判断建立相对应的运算

对象,还是有缺点,这边在判断上就需要花上一些成本,我想很些人会想到 反射 技术。

三小侠  小弟献丑,欢迎指教