首页 > 其他 > 详细

简单工厂模式和工厂模式

时间:2014-02-16 23:09:49      阅读:472      评论:0      收藏:0      [点我收藏+]

    在对比两种模式之前,首先需要学习  开放-封闭原则。在以前学习的过程中,听说过很多次,编写程序要遵循开闭原则。

    在做项目的过程中,因为需求的添加,经常会更新软件。更新软件,就要设计到修改代码了。在面向对象的程序设计中,经常会写类。如果因为添加需求,去修改已经完成的类。那么他是不符合开闭原则的。

    添加需求,应该让代码去扩展,而不是去修改。通过抽象类和继承来实现开闭原则。

    开闭原则:对于扩展是开放的,对于更改是封闭的。

    使用开闭原则,可以给面向对象的程序设计带来巨大的好处,使得代码可维护、可扩展、可复用、灵活性好。

 

首先来看一下简单工厂模式:

bubuko.com,布布扣

实现的代码:

public class Operation               //定义操作类
    {
        private double num1 = 0;
        private double num2 = 0;
        public double NumberA                //第一个操作数
        {
            get { return num1; }
            set { num1 = value;}
        }
        public double NumberB                   //第二个操作数
        {
            get { return num2; }
            set { num2 = value; }
        }
        public virtual double GetResult()             //返回执行结果
        {
            double result = 0;
            return result;
        }
    }
    public class OperationAdd : Operation            //加法类,继承操作类
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
    public class OperationSub : Operation               //减法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            result = NumberA - NumberB;
            return result;
        }
    }
    public class OperationMul : Operation               //乘法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            result = NumberA * NumberB;
            return result;
        }
    }
    public class OperationDiv : Operation               //除法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            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;
            }
            return oper;
        }
    }


 

    通过上面的例子,你会发现,在简单工厂模式中,如果要增加需求,必须修改的类有OperationFactory,每次增加需求都需要修改工厂,这样是既对扩展开放,又对修改也开放了。这就就违背了 - 原则。

    在简单工厂里面,不需要管改用哪个类的实例,只需要把‘+‘给工厂,工厂自动就给出了相应的实力。客户端只需要去做运算就可以了。根据不同的实例去实现不同的运算,扩展需要修改工厂中的case语句。所以违背了开闭原则。

    对于工厂模式,根据不同的实例,来对应不同的工厂。对修改进行封闭。如果需要扩展,只需要增加相应的工厂类即可。这样就不需要修改原有的工厂了。

 

在来看一下工厂模式:

bubuko.com,布布扣

实现的代码:

class Program
    {
        static void Main(string[] args)
        {

        }
    }

    public class Operation              //定义操作类
    {
        private double num1 = 0;
        private double num2 = 0;
        public double NumberA           //第一个操作数
        {
            get { return num1; }
            set { num1 = value; }
        }
        public double NumberB            //第二个操作数
        {
            get { return num2; }
            set { num2 = value; }
        }
        public virtual double GetResult()            //得到执行结果
        {
            double result = 0;
            return result;
        }
    }
    public class OperationAdd : Operation           //加法类,继承操作类
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
    public class OperationSub : Operation           //减法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            result = NumberA - NumberB;
            return result;
        }
    }
    public class OperationMul : Operation           //乘法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            result = NumberA * NumberB;
            return result;
        }
    }
    public class OperationDiv : Operation           //除法类,继承操作类
    {
        public override double GetResult()
        {
            double result;
            result = NumberA / NumberB;
            return result;
        }
    }

    interface IFactory                       //建立一个工厂接口
    {
        Operation CreateOperation();
    }
    class AddFactory : IFactory             //加法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
    class SubFactory : IFactory             //减法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    class MulFactory : IFactory             //乘法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    class DivFactory : IFactory             //除法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }


    对比两种设计模式,工厂模式是在简单工厂模式上稍作改进得到的,更优于简单工厂模式,使得代码可维护、可扩展、可复用、灵活性好。

 

简单工厂模式和工厂模式

原文:http://blog.csdn.net/zc474235918/article/details/19283005

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!