设计模式------简单工厂模式(三)

简单工厂几乎都算不上是设计模式,同时也不符合开放-封闭的面向对象原则,每次的修改都要更改工厂类,但是同时也是平时中用的最多的一种设计模式,比如数据访问层设计多数据库访问。

 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。 就是说解耦全部靠工厂类来实现。

 

下面,我们以经典的计算器为案例,分析下简单工厂。

 创建运算操作符的基类,定义2个变量,一个运算的方法。

    public abstract class 操作符基类
    {
        public double A;
        public double B;
        public abstract double 运算();
    }

实现操作符的加减乘除类(这个可随意扩展,也符合开放封闭原则)

 public class 加法 : 操作符基类
    {
        public override double 运算()
        {
            return A + B;
        }
    }

    public class 减法 : 操作符基类
    {
        public override double 运算()
        {
            return A - B;
        }
    }


    public class 乘法 : 操作符基类
    {
        public override double 运算()
        {
            return A * B;
        }
    }


    public class 除法 : 操作符基类
    {
        public override double 运算()
        {
            if (B.Equals(0))
            {
                throw new Exception("被除数不能为0");
            }
            return A / B;
        }
    }

 

工厂类,用来负责创建对象,解耦合,但是这个类会经常改动,这是一个非常大的缺点。

 

 

 public static 操作符基类 创建操作类(string op)
        {
            操作符基类 result = null;

            switch (op)
            {
                case "+":
                    result = new 加法();
                    break;
                case "-":
                    result = new 减法();
                    break;
                case "*":
                    result = new 乘法();
                    break;
                case "/":
                    result = new 除法();
                    break;
            }
            return result;
        }

客户端调用起来非常方便,最重要的时候 不用管里面的实现。

  static void Main(string[] args)
        {
            操作符基类 op = 简单工厂.创建操作类("+");
            op.A = 1.0;
            op.B = 3.5;

            Console.WriteLine(op.运算());
            Console.ReadLine();
        }

简单工厂模式:就是如何去实例化对象的问题,对于很容易变化的问题,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。

 

posted @ 2017-09-20 17:58  关关雎鸠,在广州  阅读(151)  评论(0编辑  收藏  举报