设计模式之工厂方法模式

原创 2017年06月11日 11:13:21

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


第一个图是工厂模式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();

        }

    }



程序的入口:


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



      

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


Java设计模式之“工厂方法模式”

工厂方法模式 与简单工厂模式不同的是,简单工厂模式是工厂自己去实现对所有产品的构造的过程。根据不同的指令去生产对应的产品。但是,如果需求有变更,有新的产品需要去生产,或者有旧的产品不必去生产,都需要去...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2016年03月25日 21:45
  • 531

Java设计模式之工厂方法模式【Factory Method Pattern】

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的...
  • Lixuanshengchao
  • Lixuanshengchao
  • 2016年05月04日 21:27
  • 975

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月04日 22:29
  • 2597

软件设计模式——工厂方法模式(Factory Method)

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到相应的产品中去。相应的角色如下: (1)抽象...
  • Jungle_hello
  • Jungle_hello
  • 2016年04月13日 22:51
  • 912

23种设计模式----创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)

1.单例模式  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自己实例化并向整个系统提供这个实例。   通用类图如下:      通用代码如下:public cl...
  • oChangWen
  • oChangWen
  • 2017年06月17日 21:37
  • 449

设计模式实战应用之五:工厂方法模式

工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的抽象工厂方法的示例;java.n...
  • defonds
  • defonds
  • 2014年07月30日 18:23
  • 4625

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4761

大话设计模式C++实现-第8章-工厂方法模式

一、UML图 二、包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三、优势 (1)工厂方法模式是对简单工厂模式的稍微的改进。工厂方法模式的用意是定义一个创建产品对象的工...
  • XD_lixin
  • XD_lixin
  • 2014年11月09日 22:26
  • 1844

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 3816

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)