设计模式之工厂方法模式
定义
工厂方法模式,定义抽象工厂类来负责定义创建对象的公共接口,而具体工厂类则负责生成具体的对象。
类型
创建型。
角色:
抽象产品:它是定义产品的接口,产品对象的公共父类
具体产品:它实现了抽象产品接口,具体工厂和具体产品之间一一对应,具体产品由专门的具体工厂创建。
抽象工厂:用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
具体工厂:它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
与简单工厂模式相比,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类
代码:
抽象产品
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
设计模式之工厂方法模式相关推荐
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- 设计模式复习-工厂方法模式
设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...
- C#设计模式(3)——工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 设计模式之工厂方法模式(创建型)
一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...
- 设计模式之工厂方法模式应用例题
设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...
- 设计模式:工厂方法模式(Factory method)
设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...
- 【设计模式】工厂方法模式(C#)
[设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...
- 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例
文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...
- 设计模式之工厂方法模式(Factory Method)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- 021 设计模式之工厂方法模式,抽象工厂模式的区别
简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...
最新文章
- 使用webpack打包的后,公共请求路径的配置问题
- 隐藏头视图即隐藏UINavigationBar
- Spring-aop注解开发(切点表达式的抽取)
- 字节跳动python面试题_字节跳动2019两道春招笔试题python解法
- SQL SERVER与ACCESS、EXCEL的数据转换
- Ext.state.Manager.setProvider(new Ext.state.CookieProvider())
- c3p0数据库连接池不能取到连接
- 计算机维修费税收分类,维修费税收分类编码是多少?
- 【管理】日报,周报,会议记录模板
- IPFS是创建DWeb应用程序中基础技术的领先者
- 刘庆付统考计算机基础选择题答案
- Python简单的音频处理
- 软考-多媒体基础知识
- 【数据结构】哈夫曼编码
- ANSYS中的轴承载荷(BearingLoad)_51CAE_新浪博客
- 基于Android平台的手机安全助手的设计与实现
- 如何扎实的学好ABAP?我的个人经验
- “天地不仁,以万物为刍狗”正解
- 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
- 【镜像取证篇】DD和E01镜像格式区别(简)