设计模式之工厂方法模式

Posted XiNanHeiShao

tags:

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

   今天杨哥给小伙伴们带来了工厂方法设计模式,那么小伙们就有一个疑问了,工厂方法设计模式和之前杨哥所讲的工厂模式有何区别呢,是不是同一个呢,现在杨哥为小伙们解答这个疑问,先上两个图:

 

第一个图是工厂模式UML类图

       

技术分享

 

第二个图是工厂方法UML类图:

技术分享

 

           根据两幅图所示,工厂方法多了几个具体的工厂类。其实之前的工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体的产品(加法类或其它类)的依赖。只要把"+"传给工厂类,工厂自动返回相应的实例做不同的运算功能。但问题也就在这里,如果想再加上一种运算方式,那就要去修改工厂类,需求的变化会去修改原来的类,这实在不太好,不灵活,违背了程序设计中的开放-封闭原则。所以呢,工厂方法设计模式应运而生啊,杨哥先上代码再说:

   

运算类

 

package factorymethod_designmode;

//运算类

public class Operation {

public double get_numberA() {

return _numberA;

}

 

public void set_numberA(double _numberA) {

this._numberA = _numberA;

}

 

 

 

public double get_numberB() {

return _numberB;

}

 

 

 

public void set_numberB(double _numberB) {

this._numberB = _numberB;

}

 

 

 

private double _numberA = 0;

    private double _numberB = 0;

    

    

    /// 得到运算结果

    public  double getResult()

    {

        double result = 0; 

        return result;

    }

}

 

几种具体的计算类

 

    /// <summary>

    /// 加法类

    /// </summary>

    class OperationAdd extends Operation

    {

         public double getResult()

        {

            double result = 0; 

            result = get_numberA() + get_numberB();

            return result;

        }

    }

 

    /// <summary>

    /// 减法类

    /// </summary>

    class OperationSub extends Operation

    {

       public  double getResult()

        {

            double result = 0;

            result = get_numberA() - get_numberB();

            return result;

        }

    }

 

    /// <summary>

    /// 乘法类

    /// </summary>

    class OperationMul extends Operation

    {

        public  double getResult()

        {

            double result = 0;

            result = get_numberA() * get_numberB();

            return result;

        }

    }

 

    /// <summary>

    /// 除法类

    /// </summary>

    class OperationDiv extends Operation

    {

        public  double getResult()

        {

            double result = 0;

            if (get_numberB()==0)

try {

throw new Exception("除数不能为0。");

} catch (Exception e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

            result = get_numberA() / get_numberB();

            return result;

        }

    }

 

工厂方法接口

package factorymethod_designmode;

//工厂方法

public interface IFactory {

 Operation CreateOperation();

}

 

几个具体的工厂类

 // 专门负责生产“+”的工厂

    class AddFactory implements IFactory

    {

        public Operation CreateOperation()

        {

            return new OperationAdd();

        }

    }

    

    // 专门负责生产“-”的工厂

    class SubFactory implements IFactory

    {

        public Operation CreateOperation()

        {

            return new OperationSub();

        }

    }

 

    // 专门负责生产“*”的工厂

    class MulFactory implements IFactory

    {

        public Operation CreateOperation()

        {

            return new OperationMul();

        }

    }

 

 

    // 专门负责生产“/”的工厂

    class DivFactory implements IFactory

    {

        public Operation CreateOperation()

        {

            return new OperationDiv();

        }

    }

 

 

程序的入口:

 

技术分享

        其实啊杨哥要告诉小伙伴的是工厂方法设计模式定义了一个用于创建对象的接口,让子类决定实例化哪一个具体的类,工厂方法使一个类的实例化延迟到其子类。如图诠释

技术分享

      

杨哥讲工厂方法设计模式就这么简单易懂,呵呵,觉得杨哥说的有道理的小伙们可以给杨哥点个赞,说个评论哦。

 

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

设计模式之工厂模式详解和应用

设计模式之工厂方法模式

设计模式之工厂方法模式

设计模式之工厂方法模式

设计模式之工厂方法模式

PHP设计模式—工厂模式之工厂方法模式