一天一个设计模式:工厂方法模式
工厂方法模式:
定义一个生产产品对象的工厂接口,将创建生产产品的工厂的工作交给子类实现。
随着实际需要的工厂数量增加,简单工厂模式体积会迅速膨胀,代码迅速臃肿严重。
补充:工厂方法模式是针对一类产品的工厂
所以为了代码的可阅读下与可维护性,也做到不同的业务有一定的隔离,将工厂的功能抽象出来成一个接口。
工厂模式的结构:
抽象工厂角色: 负责定义工厂的各个功能,是个抽象接口,所有的生产工厂都需要实现它。
具体工厂角色: 实现抽象工厂,针对不同的产品进行生产。
抽象产品角色: 是工厂生产的产品的抽象
具体产品角色: 是工厂生产的具体的产品。
实例:
抽象工厂:
public interface ExportFactory {public ExportFile factory(String type); }
View Code
具体工厂:
public class ExportHtmlFactory implements ExportFactory{@Overridepublic ExportFile factory(String type) {// TODO Auto-generated method stubif("standard".equals(type)){return new ExportStandardHtmlFile();}else if("financial".equals(type)){return new ExportFinancialHtmlFile();}else{throw new RuntimeException("没有找到对象");}}}
View Code
public class ExportPdfFactory implements ExportFactory {@Overridepublic ExportFile factory(String type) {// TODO Auto-generated method stubif("standard".equals(type)){return new ExportStandardPdfFile();}else if("financial".equals(type)){return new ExportFinancialPdfFile();}else{throw new RuntimeException("没有找到对象");}}}
View Code
抽象产品:
public interface ExportFile {public boolean export(String data); }
View Code
具体产品:
public class ExportFinancialHtmlFile implements ExportFile{@Overridepublic boolean export(String data) {// TODO Auto-generated method stub/*** 业务逻辑*/System.out.println("导出财务版HTML文件");return true;}}
View Code
public class ExportFinancialPdfFile implements ExportFile{@Overridepublic boolean export(String data) {// TODO Auto-generated method stub/*** 业务逻辑*/System.out.println("导出财务版PDF文件");return true;}}
View Code
public class ExportStandardHtmlFile implements ExportFile{@Overridepublic boolean export(String data) {// TODO Auto-generated method stub/*** 业务逻辑*/System.out.println("导出标准HTML文件");return true;}}
View Code
public class ExportStandardPdfFile implements ExportFile {@Overridepublic boolean export(String data) {// TODO Auto-generated method stub/*** 业务逻辑*/System.out.println("导出标准PDF文件");return true;}}
View Code
测试代码:
public class Test {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString data = "";ExportFactory exportFactory = new ExportHtmlFactory();ExportFile ef = exportFactory.factory("financial");ef.export(data);}}
View Code
工厂方法模式与简单工厂模式:
工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。
如果系统需要加入一个新的导出类型,那么所需要的就是向系统中加入一个这个导出类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。
其实是在简单工厂的基础上再进行一层抽象,进行一个维度的解耦与简化。方便后来代码的维护与可阅读性。
参考链接:
https://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html
https://www.cnblogs.com/xrq730/p/4905578.html
转载于:https://www.cnblogs.com/lilinzhiyu/p/9848608.html
一天一个设计模式:工厂方法模式相关推荐
- 4. 星际争霸之php设计模式--工厂方法模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- java 工厂方法_java设计模式-工厂方法模式
1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...
- 设计模式 | 工厂方法模式及典型应用
工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- 工厂方法模式_1天1个设计模式——工厂方法模式
意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...
- [设计模式] ------ 工厂方法模式
工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...
- JAVA设计模式 - 工厂方法模式
工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...
- Java设计模式—工厂方法模式抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- C#设计模式--工厂方法模式
0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...
- 设计模式 - 工厂方法模式 - 基于 Java 实现
常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...
最新文章
- (Question)CSS中position的绝对定位问题
- mysql 密码清楚_mysql 密码清除
- java url使用rest风格_Restful风格的URL请求
- 引用和const 引用的区别(转自chinaitlab)
- 推荐一篇关于java集合的博文,写的很nice
- 只有程序员才看得懂的情书
- 线性回归(单神经元,多神经元)和多层感知机(多个神经元)对比
- android studio maven gradle,Maven Dependencies with Android Studio / Gradle
- wpf之窗口ShowDialog
- 【浙江大学PAT真题练习乙级】1006 换个格式输出整数 (15分) 真题解析
- 软件工程 四则运算(结对编程)
- 主数据——共享数据的核心,数据资产的灵魂
- GB28181实现对安防摄像头的直播回放控制
- FPGA之VGA转HDMI之编码模块的编写
- 功能测试非常重要的43个功能测试点...
- LattePanda入手笔记
- C/C++面试题-1
- 中英数据库专家谈:数据库的过去、未来和现在
- 网络舆情信息查找网站与怎么查的方法详解
- 英特尔小心!AMD发ARM架构Opteron处理器
热门文章
- android碎片实验报告,《Android 移动应用开发》实验报告-范本78(29页)-原创力文档...
- cad中填充的剖面线不能被修剪_在模具行业中CAD二维制图的相关绘图规范
- zTree节点增删改
- 某8位微型计算机地址码为18位,计算机组成原理复习题.doc
- Codeforces Round #666 (Div. 2) A. Juggling Letters
- Steam游戏Hacknet部分命令备份
- oracle存储过程数量,Oracle:存储过程的可变参数数量
- JAVA面向对象OOP、类、属性、方法、样例代码
- 自然数幂与伯努利数,分数相加
- 2015蓝桥杯C++A:牌型种数(分配问题)