- 浏览: 46686 次
- 性别:
- 来自: 北京
文章分类
最新评论
用来解决上述问题的一个合理的解决方案就是工厂方法模式。那么什么是工厂方法模式呢? (2)应用工厂方法模式来解决的思路 工厂方法模式的结构如图3所示: (1)先看看Product的定义,示例代码如下: /** * 工厂方法所创建的对象的接口 */ public interface Product { //可以定义Product的属性和方法 } /** * 具体的Product对象 */ public class ConcreteProduct implements Product { //实现Product要求的方法 } (3)接下来看看创建器的定义,示例代码如下: /** * 创建器,声明工厂方法 */ public abstract class Creator { /** * 创建Product的工厂方法 * @return Product对象 */ protected abstract Product factoryMethod(); /** * 示意方法,实现某些功能的方法 */ public void someOperation() { //通常在这些方法实现中,需要调用工厂方法来获取Product对象 Product product = factoryMethod(); } } (4)再看看具体的创建器实现对象,示例代码如下: /** * 具体的创建器实现对象 */ public class ConcreteCreator extends Creator { protected Product factoryMethod() { //重定义工厂方法,返回一个具体的Product对象 return new ConcreteProduct(); } } 要使用工厂方法模式来实现示例,先来按照工厂方法模式的结构,对应出哪些是被创建的Product,哪些是Creator。分析要求实现的功能,导出的文件对象接口ExportFileApi就相当于是Product,而用来实现导出数据的业务功能对象就相当于Creator。把Product和Creator分开过后,就可以分别来实现它们了。 /** * 导出成文本文件格式的对象 */ 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(); } } 再看看创建导出成数据库备份文件形式的对象,示例代码如下: /** * 具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象 */ 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的对象,切换成其它的实现对象,试试看会发生什么。看来应用工厂方法模式是很简单的,对吧。 未完待续...... 2 解决方案
2.1 工厂方法模式来解决
(1)工厂方法模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
仔细分析上面的问题,事实上在实现导出数据的业务功能对象里面,根本就不知道究竟要使用哪一种导出文件的格式,因此这个对象本就不应该和具体的导出文件的对象耦合在一起,它只需要面向导出的文件对象的接口就好了。
但是这样一来,又有新的问题产生了:接口是不能直接使用的,需要使用具体的接口实现对象的实例。
这不是自相矛盾吗?要求面向接口,不让和具体的实现耦合,但是又需要创建接口的具体实现对象的实例。怎么解决这个矛盾呢?
工厂方法模式的解决思路很有意思,那就是不解决,采取无为而治的方式:不是需要接口对象吗,那就定义一个方法来创建;可是事实上它自己是不知道如何创建这个接口对象的,没有关系,那就定义成抽象方法就好了,自己实现不了,那就让子类来实现,这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了。
2.2 模式结构和说明
图3 工厂方法模式结构示意图
Product:
定义工厂方法所创建的对象的接口,也就是实际需要使用的对象的接口。
ConcreteProduct:
具体的Product接口的实现对象。
Creator:
创建器,声明工厂方法,工厂方法通常会返回一个Product类型的实例对象,而且多是抽象方法。也可以在Creator里面提供工厂方法的默认实现,让工厂方法返回一个缺省的Product类型的实例对象。
ConcreteCreator:
具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例。
2.3 工厂方法模式示例代码
(2)再看看具体的Product的实现对象,示例代码如下:
2.4 使用工厂方法模式来实现示例
使用工厂模式来实现示例的程序结构如图4所示:
图4 使用工厂模式来实现示例的程序结构示意图
下面一起来看看代码实现。
(1)导出的文件对象接口ExportFileApi的实现没有变化,这里就不去赘述了
(2)接下来看看接口ExportFileApi的实现,为了示例简单,只实现导出文本文件格式和数据库备份文件两种。先看看导出文本文件格式的实现,示例代码如下:
发表评论
-
观察者(Observer)模式
2011-07-07 09:05 839观察者(Observer)模式又名发布-订阅(Publis ... -
设计模式-配套源代码.rar
2011-07-05 11:11 627不多说,直接上源码。。 -
研磨设计模式之工厂方法模式-5
2011-07-05 11:10 6743.3 平行的类层次结 ... -
研磨设计模式之工厂方法模式-4
2011-07-05 11:09 5403.2 工厂方法模式与IoC/DI IoC——Inv ... -
研磨设计模式之工厂方法模式-3
2011-07-05 11:08 5973 模式讲解 3.1 ... -
模式1.研磨设计模式之工厂方法模式-1
2011-07-05 11:07 671工厂方法模式(Factory Method) 1 ... -
研磨设计模式之桥接模式-4
2011-07-05 11:04 6653.4 广义桥接-Java中无处不桥接 ... -
研磨设计模式之桥接模式-3
2011-07-05 11:04 6373 模式讲解 3.1 认 ... -
研磨设计模式之桥接模式-2
2011-07-05 11:03 6842 解决方案 2.1 桥接模式来解决 ... -
模式4.研磨设计模式之桥接模式-1
2011-07-05 11:02 738来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设 ... -
研磨设计模式之策略模式-6
2011-07-05 10:57 7243.4 策略模式结合模 ... -
研磨设计模式之策略模式-5
2011-07-05 10:56 656接策略模式-4,其实是讲的一个主题,写在一个里面超长了,只 ... -
研磨设计模式之策略模式-4
2011-07-05 10:55 6713.3 Context和Strategy的 ... -
研磨设计模式之策略模式-3
2011-07-05 10:54 6523 模式讲解 3.1 认识策略模式 (1)策略模 ... -
研磨设计模式之策略模式-2
2011-07-05 10:53 7822 解决方案 2.1 策 ... -
模式2.研磨设计模式之策略模式-1
2011-07-05 10:52 657首先感谢众多朋友的支持、评论和鼓励,只有多多努力,写点 ... -
研磨设计模式之单例模式-4
2011-07-05 10:50 8523.8 在Java中一种更好的单例实现方式 ... -
研磨设计模式之单例模式-3
2011-07-05 10:49 6883.3 延迟加载的思想 单例模式的懒汉 ... -
研磨设计模式之单例模式-2
2011-07-05 10:48 8643 模式讲解 3.1 认识单例模式 (1)单例模式 ... -
模式3.研磨设计模式之单例模式-1
2011-07-05 10:47 656单例模式(Singleton) 1 ...
相关推荐
研磨设计模式之 工厂方法模式.doc
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
Java牛人精华之作,制成PDF格式电子书,分享
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
单例模式、工厂方法模式、策略模式、命令模式和桥接模式。
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
研磨设计模式系列,包括: 单例模式、工厂方法模式、策略模式、命令模式和桥接模式
先写写设计模式方面的内容吧,就是GoF的23个模式,先从大家最熟悉的工厂方法模式开始,这个最简单,明白的人多,看看是否能写出点跟别人不一样的东西,欢迎大家来热烈讨论,提出建议或意见,并进行批评指正,一概...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》这本书的心得,一共24个模式,每两个一篇文档。最后还有一篇整体的读数心得。原本打算贴到博客上的,没时间,算了,直接以资源形式发布吧。
《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) 本质:封装交互,简化调用 --第四章:适配器模式(Adapter) 本质:转换匹配,复用功能 --第五章:单例模式(Singleton) ...
那么,如果想成为一个有深度的男人(程序猿),还是应该好好的学习一下该开源框架的源码,从而可以更好的领会设计模式的精髓(面试?)。 )。实际上可能是平常的业务开发中,并不会去深究各个框架的源代码,也常常...
控制器采用可编程控制器S7 315-2DP PLC和ST EP7 V5.2 PLC编程软件对水泥生产链的整个过程进行逻辑控制,解决设备之间的联锁问题。 控制系统和管理系统的网络规划 1.使用局域网。企业管理信息化、网络化、自动化。...