Java描述设计模式(03):工厂方法模式
本文源码:GitHub·点这里 || GitEE·点这里
一、工厂方法模式
1、生活场景
系统常见的数据导出功能:数据导出PDF、WORD等常见格式。
2、工厂方法模式
是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
3、核心角色
1)、抽象工厂角色
这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。
2)、具体工厂角色
担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类。
3)、抽象导出角色
工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。
4)、具体导出角色
这个角色实现了抽象导出角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。
4、代码UML关系图

5、源代码实现
// 客户端角色
public class C01_FactoryMethod {
public static void main(String[] args) {
String data = "" ;
ExportFactory factory = new ExportWordFactory () ;
ExportFile exportWord = factory.factory("user-word") ;
exportWord.export(data) ;
factory = new ExportPdfFactory() ;
ExportFile exportPdf =factory.factory("log-pdf") ;
exportPdf.export(data) ;
}
}
// 抽象工厂角色
interface ExportFactory {
ExportFile factory (String type) ;
}
// 具体工厂角色
class ExportWordFactory implements ExportFactory {
@Override
public ExportFile factory(String type) {
if ("user-word".equals(type)){
return new ExportUserWordFile() ;
} else if ("log-word".equals(type)){
return new ExportLogWordFile() ;
} else {
throw new RuntimeException("没有找到对象") ;
}
}
}
class ExportPdfFactory implements ExportFactory {
@Override
public ExportFile factory(String type) {
if ("user-pdf".equals(type)){
return new ExportUserPdfFile() ;
} else if ("log-pdf".equals(type)){
return new ExportLogPdfFile() ;
} else {
throw new RuntimeException("没有找到对象") ;
}
}
}
// 抽象导出角色
interface ExportFile {
boolean export (String data) ;
}
// 具体导出角色
class ExportUserWordFile implements ExportFile {
@Override
public boolean export(String data) {
System.out.println("导出用户Word文件");
return true;
}
}
class ExportLogWordFile implements ExportFile {
@Override
public boolean export(String data) {
System.out.println("导出日志Word文件");
return true;
}
}
class ExportUserPdfFile implements ExportFile {
@Override
public boolean export(String data) {
System.out.println("导出用户Pdf文件");
return true;
}
}
class ExportLogPdfFile implements ExportFile {
@Override
public boolean export(String data) {
System.out.println("导出日志Pdf文件");
return true;
}
}
二、Spring框架中应用
1、场景描述
基于spring框架的配置实现如下流程:汽车工厂根据不同的国家,生产不同类型的汽车。
2、核心工厂类
public class ProductCar implements CarFactory {
private Map<String, CarEntity> carMap = null;
public ProductCar() {
carMap = new HashMap<>();
carMap.put("china", new CarEntity("中国", "黑色","红旗"));
carMap.put("america", new CarEntity("美国", "白色","雪佛兰"));
}
@Override
public CarEntity getCar(String type) {
return carMap.get(type);
}
}
3、核心Xml配置文件
<bean id="productCarFactory" class="com.model.design.spring.node03.factoryMethod.ProductCar" />
<bean id="car1" factory-bean="productCarFactory" factory-method="getCar">
<constructor-arg name="type" value="china" />
</bean>
<bean id="car2" factory-bean="productCarFactory" factory-method="getCar">
<constructor-arg name="type" value="america" />
</bean>
4、测试类
1)、代码块
public class SpringTest {
@Test
public void test01 (){
ApplicationContext context01 = new ClassPathXmlApplicationContext("/spring/spring-factorymethod.xml");
CarEntity car1 = (CarEntity)context01.getBean("car1") ;
CarEntity car2 = (CarEntity)context01.getBean("car2") ;
System.out.println(car1);
System.out.println(car2);
}
}
2)、输出结果
CarEntity{country='中国', color='黑色', name='红旗'}
CarEntity{country='美国', color='白色', name='雪佛兰'}
三、工厂方法小结
工厂方法中,把创建类的动作延迟,就是通过对应的工厂来生成类的对象,这种设计方式符合“开闭”原则。缺点就是当产品的种类过多的时候,需要定义很多产品对应的工厂类。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(03):工厂方法模式的更多相关文章
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- php设计模式之工厂方法模式
php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
随机推荐
- 重学前端--js是面向对象还是基于对象?
重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...
- JS正则表达式语法(含ES6)(表格简要总结)
文章目录 JS正则表达式 1. JS中正则表达式定义 2. 直接量字符 3. 字符类 4. 重复字符 5. 选择,分组和引用 6. 指定匹配位置 7. 修饰符 8. String 方法 9. RegE ...
- JUC-7-lock接口
解决多线程安全的方式 synchronized 隐式锁 1.同步代码块 2.同步方法 3.lock 同步锁 显式锁 lock()方法上锁 unlo ...
- 日志介绍与rsyslogd服务管理与配置
一.日志简介 1.日志相关服务介绍 在 CentOS 6.x 中日志服务使用 rsyslogd 服务,rsyslogd 具有以下特点: 基于 TCP 网络协议传输日志信息 更安全的网络传输方式 有日志 ...
- vue-其他
vue-resource // 2.1 导入 vue-resource import VueResource from 'vue-resource' // 2.2 安装 vue-resource Vu ...
- JS---案例:点击按钮摇起来 & 星星闪动 (挺难看的)
案例1:点击按钮摇起来 思路: 1. 2张图片,放进div里面,摇起来的本质是,此div按上下左右的位置和在一定的时间内发生移动 2. 所以用随机数的概念来实现位置的移动,用setInterval来实 ...
- threejs 限制物件只能在指定平面上拖拽
threejs提供有 DragController.js的例子来辅助拖拽 该例子可以在基于当前屏幕的x和y轴上拖拽物体,但是它不能影响z轴. 查看代码,可以在touchStart\mousedown下 ...
- Netty如何监控内存泄露
目录 Netty如何监控内存泄露 前言 JDK的弱引用和引用队列 Netty的实现思路 代码实现 分配监控对象 追踪和检查泄露 Netty如何监控内存泄露 前言 一般而言,在Netty程序中都会采用池 ...
- jquery 点击tr选中checkbox,解决checkbox的默认点击事件被阻止的问题
1.第一种,!$(event.target).is('input'),判断触发事件的元素是否为input.此时使用event.target,而不是this,获取事件本身,防止触发事件冒泡的问题 ...
- Choose the WinForms UI Type 选择 WinForms UI 类型
In this lesson, you will learn how to change the UI Type of the WinForms application. By default, th ...