简单工厂模式----工厂方法的结合使用

   单一职责原则

    定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 

   里氏替换原则

    定义:所有引用基类的地方必须能透明地使用其子类的对象。

   依赖倒置原则

    定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

   接口隔离原则

    定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 

   迪米特法则

    定义:一个对象应该对其他对象保持最少的了解。

   开闭原则

    定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

    简单工厂模式呢,个人觉得他就是封装了改变,其他的设计模式都没有体现出来;

  就比如现在我们要做一个简单的支持加减乘除的软件,我们来看第一版软件

  

        /// <summary>
        ///一个简单的操作类
        /// </summary>
        /// <param name="s"> 操作符</param>
        /// <param name="d1">被操作数</param>
        /// <param name="d2">操作数</param>
        /// <returns></returns>
       static double count(string s,double d1,double d2)
        {
            double count = 0;
            switch (s)
            {
                case "+": count = d1 + d2; break;
                case "-": count=d1-d2;   break;
                case "*": count = d1 * d2; break;
                case "/": count = d1 / d2; break;
            }
            return count;
        }

  这样我们就可以实现一个简单的计算的功能了,可是如果,我们需要添加一个求平方的功能呢?

    那我们就需要在count方法中添加对应的case和后面对应的方法,想想这样子的不好的地方

      不符合,对修改关闭,对拓展开放这个原则.也就是不便于拓展

      既然他们都有一个计算的方法,那我们就可以提取出一个父类/接口就可以了

        但是在这里声明一个接口很明显不是一个好的选择,因为这样会多做一步,所以在这里我们选择 父类的方法来实现

  

        /// <summary>
        ///一个简单的操作类
        /// </summary>
        /// <param name="s"> 操作符</param>
        /// <param name="d1">被操作数</param>
        /// <param name="d2">操作数</param>
        /// <returns></returns>
        static double count(string s, double d1, double d2)
        {
            oo io = null;
            switch (s)
            {
                case "+": io=new Add(d1,d2); break;
                case "-": io = new subtract(d1, d2); break;
            }
            return io.count();
        }

        abstract class oo//抽象基类
        {
            public virtual double d1 { get; set; }
            public virtual double d2 { get; set; }
            public abstract double count();
            public oo(double d1,double d2)
            {
                this.d1 = d1;
                this.d2 = d2;
            }
            
        }
        class Add:oo//加法类
        {
            public Add(double d1, double d2) : base(d1, d2) { }
            public override double count()
            {
                return this.d1 + this.d2;
            }
        }
        class subtract : oo//减法类
        {
            public subtract(double d1, double d2) : base(d1, d2) { }
            public override double count()
            {
                return this.d1 - this.d2;
            }
        }

    

   但是向上面那样写,会发现我们有回到了问题的原点,解决的办法就是使用工厂方法

    那么什么是工厂方法呢? 既然是工厂,那么就一定有流水线,那么流水线是干嘛的呢?流水线当然是用来生产产品的,

      当然具体生产什么产品,得看是什么流水线了,接下来对我们的方法进行改造

    

        interface IOp
        {
            oo Opeator(double d1,double d2);//方法一个具体的操作对象
        }
        class AddFactory : IOp
        {

            public oo Opeator(double d1,double d2)
            {
                return new Add(d1, d2);
            }
        }
        class SubtractFactory : IOp
        {
            public oo Opeator(double d1, double d2)
            {
                return new subtract(d1, d2);
            }
        }

  使用的时候就可以直接创建对应的工厂来返回相应的对象

Hold on, everything is possible.
原文地址:https://www.cnblogs.com/student-note/p/6124786.html