设计模式——简单工厂工厂方法与抽象工厂

Posted 雨飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——简单工厂工厂方法与抽象工厂相关的知识,希望对你有一定的参考价值。

  在设计模式中,如果说最简单的应该是单一职责模式(私有化构造方法。增加获取类实例的公共方法,但其中限制了实例化的个数)。但是要说具有学习价值,又是入门必备的话,我推荐是简单工厂、工厂方法与抽象工厂这三个创建型的设计模式,并进行相互比较的学习。

  简单工厂模式,其实算不上模式,既然都叫“简单”了,当然简单咯。简单工厂主要是对一类问题抽象一个父类(父类的方法一般为虚方法),然后基于这个父类创建子类们,然后在创建子类的时候,通过条件判断选择合适的子类。简单工厂模式的好处是,通过对子类的封装,增加了子类的封闭性,避免子类被随便更改。对外暴露的是工厂类,对后期扩展性,更加灵活、开放。现在举个简单工厂的例子,通过计算器的实现说明简单工厂的好处。如果在项目中,采用分层模式,UI层为一层(Winfrom或控制台),业务代码(计算器逻辑)为一层(类库)。其中业务层代码如下(现实开发中每个类为一个单独文件):

  先创建计算器运算基类。

 public class Operation
    {
        public double NumA { set; get; }
        public double NumB { set; get; }
        public virtual double GetResult() 
        {
            double result = 0;
            return result;
        }
    }

  接着以此创建运算的子类逻辑。这里只列举加减算法的子类。

public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = NumA + NumB;
            return result;
        }
    }

    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = NumA + NumB;
            return result;
        }
    }

下面增加子类选择的工厂类

public class OperationFactory
    {
        public static Operation createOperation(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
                default:
                    oper = new OperationAdd();
                    break;
            }
            return oper;
        }
    }

最后增加客户端调用的代码。

static void Main(string[] args)
        {
            Operation oper = null;
            oper = OperationFactory.createOperation("+");
            if (oper != null)//对外部类库(方法)使用,先判断是否为Null,防御性编程。
            {
                oper.NumA = 1;
                oper.NumB = 2;
                double result = oper.GetResult();
            }
        }

时间有点晚,今天先到这里。明天继续工厂方法与抽象工厂。感谢程杰老师的《大话设计模式》。

 

以上是关于设计模式——简单工厂工厂方法与抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂工厂方法抽象工厂区别

设计模式——简单工厂工厂方法与抽象工厂

java抽象工厂的使用意图是啥?

设计模式-简单工厂工厂方法模式抽象工厂模式详解

一. 抽象工厂&工厂方法&简单工厂方法

C++工厂模式(简单工厂工厂方法抽象工厂)