定义

工厂方法模式,定义抽象工厂类来负责定义创建对象的公共接口,而具体工厂类则负责生成具体的对象。

类型

创建型。

角色:

抽象产品:它是定义产品的接口,产品对象的公共父类
具体产品:它实现了抽象产品接口,具体工厂和具体产品之间一一对应,具体产品由专门的具体工厂创建。
抽象工厂:用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
具体工厂:它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
与简单工厂模式相比,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类

代码:

抽象产品

public abstract class Calculate {double numA;public double getNumA() {return numA;}public void setNumA(double numA) {this.numA = numA;}public double getNumB() {return numB;}public void setNumB(double numB) {this.numB = numB;}double numB;public Calculate(){}public Calculate(double numA,double numB){this.numA = numA;this.numB = numB;}public abstract double cal();}

具体产品

public class CalculateAdd extends Calculate {public CalculateAdd(){super();}public CalculateAdd(double numA,double numB){super();this.numA=numA;this.numB = numB;}@Overridepublic double cal() {return numA+numB;}
}
public class CalculateMultiply extends Calculate {public CalculateMultiply(){super();}public CalculateMultiply(double numA, double numB){super();this.numA=numA;this.numB=numB;}@Overridepublic double cal() {return numA*numB;}
}

抽象工厂

public abstract class CalculateFactory {public abstract Calculate getCalculate();}

具体工厂

public class CalculateAddFactory extends CalculateFactory{@Overridepublic Calculate getCalculate() {return new CalculateAdd();}
}
public class CalculateMultiplyFactory extends CalculateFactory{@Overridepublic Calculate getCalculate() {return new CalculateMultiply();}
}

业务应用

public class Test {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {CalculateFactory calculateAddFactory = new CalculateAddFactory();CalculateFactory calculateMultiFactory = new CalculateMultiplyFactory();Calculate calculateAdd = calculateAddFactory.getCalculate();calculateAdd.setNumA(1);calculateAdd.setNumB(2);System.out.printf("计算结果为:%f\n",calculateAdd.cal());Calculate calculateMultiply = calculateMultiFactory.getCalculate();calculateMultiply.setNumA(1);calculateMultiply.setNumB(2);System.out.printf("计算结果为:%f\n",calculateMultiply.cal());// 通过反射机制获取工厂类Class c = Class.forName(CalculateAddFactory.class.getName());CalculateFactory factory = (CalculateFactory) c.newInstance();Calculate calculateSample = factory.getCalculate();calculateSample.setNumB(2);calculateSample.setNumA(3);System.out.printf("计算结果为:%f\n",calculateSample.cal());}
}

工厂方法模式总结

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的不足。工厂方法模式是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。

工厂方法模式的主要优点

  • 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
  • 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合”开闭原则”。
  • 具体工厂创建具体产品,而不是统一由一个工厂来创建,符合单一职责原则

工厂方法模式的主要缺点

  • 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度

适用场景

  • 客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。
  • 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

应用:

  • Collection 中的 iterator

参考:https://whirlys.blog.csdn.net/article/details/82560410

设计模式之工厂方法模式相关推荐

  1. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  2. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  3. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  4. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  5. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  6. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  7. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

  8. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  9. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  10. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

最新文章

  1. 使用webpack打包的后,公共请求路径的配置问题
  2. 隐藏头视图即隐藏UINavigationBar
  3. Spring-aop注解开发(切点表达式的抽取)
  4. 字节跳动python面试题_字节跳动2019两道春招笔试题python解法
  5. SQL SERVER与ACCESS、EXCEL的数据转换
  6. Ext.state.Manager.setProvider(new Ext.state.CookieProvider())
  7. c3p0数据库连接池不能取到连接
  8. 计算机维修费税收分类,维修费税收分类编码是多少?
  9. 【管理】日报,周报,会议记录模板
  10. IPFS是创建DWeb应用程序中基础技术的领先者
  11. 刘庆付统考计算机基础选择题答案
  12. Python简单的音频处理
  13. 软考-多媒体基础知识
  14. 【数据结构】哈夫曼编码
  15. ANSYS中的轴承载荷(BearingLoad)_51CAE_新浪博客
  16. 基于Android平台的手机安全助手的设计与实现
  17. 如何扎实的学好ABAP?我的个人经验
  18. “天地不仁,以万物为刍狗”正解
  19. 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
  20. 【镜像取证篇】DD和E01镜像格式区别(简)

热门文章

  1. java定义integer数组_Java中的Integer
  2. Opencv-python学习路线与图像处理方面的相关技能树(西瓜6总结)
  3. SQL UPDATE 语句(更新表中的记录)
  4. trunk和acces
  5. 资深程序员参加面试因穿着被认为是新手,拿下帽子后,被当场录取
  6. Prototype属性说明
  7. 他是第一个到达学校的人英语_新视野英语unit1-unit6翻译答案(中英对照)
  8. 网站快照回档如何处理
  9. 第十二届蓝桥杯省赛Python--暴力破解
  10. python中函数是一段子程序_用Python来写一个男女相亲小程序|码农的情人节