简单工厂模式和工厂模式

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

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

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

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

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

 

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

实现的代码:

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语句。所以违背了开闭原则。

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

 

在来看一下工厂模式:

实现的代码:

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();
        }
    }


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

 

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值