工厂方法模式(Factory Method Pattern) 应用篇(上)
2014-03-09 20:28
344 查看
本文摘自:http://danielzzu.blog.163.com/blog/static/11851530420112311303240/
一、前言
工厂方法模式(Factory Method Pattern) 属于类的创建型模式,它又被称为多态工厂模式 。
本文主要讲
工厂方法模式
在实际中的应用,如果还不了解其理论知识,请先阅读《工厂方法模式(Factory
Method Pattern) 》
二、场景
考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据的导出方式,并真正执行数据导出。
在一些实际的企业应用中,一个公司的系统往往分散在很多个不同的地方运行,比如各个分公司或者是门市点,公司没有建立全公司专网的实力,但是又不愿意让业务数据实时的在广域网上传递,一个是考虑数据安全的问题,一个是运行速度的问题。
这种系统通常会有一个折中的方案,那就是各个分公司内运行系统的时候是独立的,是在自己分公司的局域网内运行。然后在每天业务结束的时候,各个分公司会导出自己的业务数据,然后把业务数据打包通过网络传送给总公司,或是专人把数据送到总公司,然后由总公司进行数据导入和核算。
通常这种系统,在导出数据上,会有一些约定的方式,比如导出成:文本格式、数据库备份形式、Excel格式、Xml格式等等。
三、遇到的问题
现在就来考虑实现上文中提到的导出数据的应用框架。
分析上面要实现的应用框架,不管用户选择什么样的导出格式,最后导出的都是一个文件,而且系统并不知道究竟要导出成为什么样的文件,因此应该有一个统一的接口,来描述系统最后生成的对象,并操作输出的文件。
先把导出的文件对象的接口定义出来,示例代码如下:
/** * 导出的文件对象的接口 */public interface ExportFileApi { /** * 导出内容成为文件 * @param data 示意:需要保存的数据 * @return 是否导出成功 */ public boolean export(String data);}
对于实现导出数据的业务功能对象,它应该根据需要来创建相应的ExportFileApi的实现对象,因为特定的ExportFileApi的实现是与具体的业务相关的。但是对于实现导出数据的业务功能对象而言,它并不知道应该创建哪一个ExportFileApi的实现对象,也不知道如何创建。
也就是说:对于实现导出数据的业务功能对象,它需要创建ExportFileApi的具体实例对象,但是它只知道ExportFileApi接口,而不知道其具体的实现。那该怎么办呢?
四、 使用工厂方法模式来实现示例
要使用工厂方法模式来实现示例,先来按照工厂方法模式的结构,对应出哪些是被创建的Product,哪些是Creator。分析要求实现的功能,导出的文件对象接口ExportFileApi就相当于是Product,而用来实现导出数据的业务功能对象就相当于Creator。把Product和Creator分开过后,就可以分别来实现它们了。
使用工厂模式来实现示例的程序结构如图4所示:
图4 使用工厂模式来实现示例的程序结构示意图
下面一起来看看代码实现。
(1)导出的文件对象接口ExportFileApi的实现没有变化,这里就不去赘述了
(2)接下来看看接口ExportFileApi的实现,为了示例简单,只实现导出文本文件格式和数据库备份文件两种。先看看导出文本文件格式的实现,示例代码如下:
/** * 导出成文本文件格式的对象 */public class ExportTxtFile implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作文件 System.out.println("导出数据"+data+"到文本文件"); return true; }}
再看看导出成数据库备份文件形式的对象的实现,示例代码如下:
/** * 导出成数据库备份文件形式的对象 */public class ExportDB implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作数据库和文件 System.out.println("导出数据"+data+"到数据库备份文件"); return true; }}
(3)Creator这边的实现,首先看看ExportOperate的实现,示例代码如下:
/** * 实现导出数据的业务功能对象 */public abstract class ExportOperate { /** * 导出文件 * @param data 需要保存的数据 * @return 是否成功导出文件 */ public boolean export(String data){ //使用工厂方法 ExportFileApi api = factoryMethod(); return api.export(data); } /** * 工厂方法,创建导出的文件对象的接口对象 * @return 导出的文件对象的接口对象 */ protected abstract ExportFileApi factoryMethod();}
(4)加入了两个Creator实现,先看看创建导出成文本文件格式的对象,示例代码如下:
/** * 具体的创建器实现对象,实现创建导出成文本文件格式的对象 */public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成文本文件格式的对象 return new ExportTxtFile(); }}
再看看创建导出成数据库备份文件形式的对象,示例代码如下:
/** * 具体的创建器实现对象,实现创建导
ac5a
出成数据库备份文件形式的对象 */public class ExportDBOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成数据库备份文件形式的对象 return new ExportDB(); }}
(5)客户端直接创建需要使用的Creator对象,然后调用相应的功能方法,示例代码如下:
public class Client { public static void main(String[] args) { //创建需要使用的Creator对象 ExportOperate operate = new ExportDBOperate(); //调用输出数据的功能方法 operate.export("测试数据"); }}
运行结果如下:
导出数据测试数据到数据库备份文件
你还可以修改客户端new的对象,切换成其它的实现对象,试试看会发生什么。看来应用工厂方法模式是很简单的,对吧。
一、前言
工厂方法模式(Factory Method Pattern) 属于类的创建型模式,它又被称为多态工厂模式 。
本文主要讲
工厂方法模式
在实际中的应用,如果还不了解其理论知识,请先阅读《工厂方法模式(Factory
Method Pattern) 》
二、场景
考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据的导出方式,并真正执行数据导出。
在一些实际的企业应用中,一个公司的系统往往分散在很多个不同的地方运行,比如各个分公司或者是门市点,公司没有建立全公司专网的实力,但是又不愿意让业务数据实时的在广域网上传递,一个是考虑数据安全的问题,一个是运行速度的问题。
这种系统通常会有一个折中的方案,那就是各个分公司内运行系统的时候是独立的,是在自己分公司的局域网内运行。然后在每天业务结束的时候,各个分公司会导出自己的业务数据,然后把业务数据打包通过网络传送给总公司,或是专人把数据送到总公司,然后由总公司进行数据导入和核算。
通常这种系统,在导出数据上,会有一些约定的方式,比如导出成:文本格式、数据库备份形式、Excel格式、Xml格式等等。
三、遇到的问题
现在就来考虑实现上文中提到的导出数据的应用框架。
分析上面要实现的应用框架,不管用户选择什么样的导出格式,最后导出的都是一个文件,而且系统并不知道究竟要导出成为什么样的文件,因此应该有一个统一的接口,来描述系统最后生成的对象,并操作输出的文件。
先把导出的文件对象的接口定义出来,示例代码如下:
/** * 导出的文件对象的接口 */public interface ExportFileApi { /** * 导出内容成为文件 * @param data 示意:需要保存的数据 * @return 是否导出成功 */ public boolean export(String data);}
对于实现导出数据的业务功能对象,它应该根据需要来创建相应的ExportFileApi的实现对象,因为特定的ExportFileApi的实现是与具体的业务相关的。但是对于实现导出数据的业务功能对象而言,它并不知道应该创建哪一个ExportFileApi的实现对象,也不知道如何创建。
也就是说:对于实现导出数据的业务功能对象,它需要创建ExportFileApi的具体实例对象,但是它只知道ExportFileApi接口,而不知道其具体的实现。那该怎么办呢?
四、 使用工厂方法模式来实现示例
要使用工厂方法模式来实现示例,先来按照工厂方法模式的结构,对应出哪些是被创建的Product,哪些是Creator。分析要求实现的功能,导出的文件对象接口ExportFileApi就相当于是Product,而用来实现导出数据的业务功能对象就相当于Creator。把Product和Creator分开过后,就可以分别来实现它们了。
使用工厂模式来实现示例的程序结构如图4所示:
图4 使用工厂模式来实现示例的程序结构示意图
下面一起来看看代码实现。
(1)导出的文件对象接口ExportFileApi的实现没有变化,这里就不去赘述了
(2)接下来看看接口ExportFileApi的实现,为了示例简单,只实现导出文本文件格式和数据库备份文件两种。先看看导出文本文件格式的实现,示例代码如下:
/** * 导出成文本文件格式的对象 */public class ExportTxtFile implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作文件 System.out.println("导出数据"+data+"到文本文件"); return true; }}
再看看导出成数据库备份文件形式的对象的实现,示例代码如下:
/** * 导出成数据库备份文件形式的对象 */public class ExportDB implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作数据库和文件 System.out.println("导出数据"+data+"到数据库备份文件"); return true; }}
(3)Creator这边的实现,首先看看ExportOperate的实现,示例代码如下:
/** * 实现导出数据的业务功能对象 */public abstract class ExportOperate { /** * 导出文件 * @param data 需要保存的数据 * @return 是否成功导出文件 */ public boolean export(String data){ //使用工厂方法 ExportFileApi api = factoryMethod(); return api.export(data); } /** * 工厂方法,创建导出的文件对象的接口对象 * @return 导出的文件对象的接口对象 */ protected abstract ExportFileApi factoryMethod();}
(4)加入了两个Creator实现,先看看创建导出成文本文件格式的对象,示例代码如下:
/** * 具体的创建器实现对象,实现创建导出成文本文件格式的对象 */public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成文本文件格式的对象 return new ExportTxtFile(); }}
再看看创建导出成数据库备份文件形式的对象,示例代码如下:
/** * 具体的创建器实现对象,实现创建导
ac5a
出成数据库备份文件形式的对象 */public class ExportDBOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成数据库备份文件形式的对象 return new ExportDB(); }}
(5)客户端直接创建需要使用的Creator对象,然后调用相应的功能方法,示例代码如下:
public class Client { public static void main(String[] args) { //创建需要使用的Creator对象 ExportOperate operate = new ExportDBOperate(); //调用输出数据的功能方法 operate.export("测试数据"); }}
运行结果如下:
导出数据测试数据到数据库备份文件
你还可以修改客户端new的对象,切换成其它的实现对象,试试看会发生什么。看来应用工厂方法模式是很简单的,对吧。
相关文章推荐
- 介绍php设计模式中的工厂模式
- asp.net 简单工厂模式和工厂方法模式之论述
- javascript 模式设计之工厂模式详细说明
- python中getattr函数使用方法 getattr实现工厂模式
- 工厂模式在Zend Framework中应用介绍
- c#使用简单工厂模式实现生成html文件的封装类分享
- PHP高级对象构建 工厂模式的使用
- 基于php设计模式中工厂模式详细介绍
- java反射机制+工厂模式+配置文件----->在谈到spring配置文件
- Head First -- 工厂方法
- Head First -- 简单工厂
- Head First -- 抽象工厂模式
- 【论题】+【方案】设计模式和工厂模式
- 工厂方法模式与抽象工厂模式
- Java设计模式 创建模式-工厂模式(Factory)
- 简单工厂模式 Simple Factory Pattern
- 工厂方法模式(Factory Method Pattern)理论篇
- C++设计模式(1)-工厂模式
- java面试题
- 工厂方法模式