设计模式--工厂模式
Posted luzhouxiaoshuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--工厂模式相关的知识,希望对你有一定的参考价值。
我们来看一下不是有工厂模式的代码
package cn.javass.dp.factorymethod.example3; /** * 导出的文件对象的接口 */ public interface ExportFileApi { /** * 导出内容成为文件 * @param data 示意:需要保存的数据 * @return 是否导出成功 */ public boolean export(String data); }
package cn.javass.dp.factorymethod.example3; /** * 导出成文本文件格式的对象 */ public class ExportTxtFile implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作文件 System.out.println("导出数据"+data+"到文本文件"); return true; } }
package cn.javass.dp.factorymethod.example3; /** * 导出成数据库备份文件形式的对象 */ public class ExportDB implements ExportFileApi{ public boolean export(String data) { //简单示意一下,这里需要操作数据库和文件 System.out.println("导出数据"+data+"到数据库备份文件"); return true; } }
package cn.javass.dp.factorymethod.example1; /** * 实现导出数据的业务功能对象 */ public class ExportOperate { /** * 导出文件 * @param type 用户选择的导出类型 * @param data 需要保存的数据 * @return 是否成功导出文件 */ public boolean export(int type,String data){ ExportFileApi api = null; //根据类型来选择究竟要创建哪一种导出文件对象 if(type == 1){ api = new ExportTxtFile(); }else if(type == 2){ api = new ExportDB(); } return api.export(data); } }
package cn.javass.dp.factorymethod.example1; public class Client { public static void main(String[] args) { ExportOperate operate = new ExportOperate(); operate.export(2, "测试数据"); } }
上面就是使用简单工厂来实现数据的导出形式
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
如果我们需要导出成XML形式
我们就要修改工厂的
public boolean export(int type,String data){
ExportFileApi api = null;
//根据类型来选择究竟要创建哪一种导出文件对象
if(type == 1){
api = new ExportTxtFile();
}else if(type == 2){
api = new ExportDB();
}
return api.export(data);
这个地方的代码。违背了违反了高内聚责任分配原则
我们可以使用工厂模式的办法来解决上面的问题
我们首先定义一个工厂操作的接口
package cn.javass.dp.factorymethod.example3; /** * 实现导出数据的业务功能对象 */ public abstract class ExportOperate { /** * 导出文件 * @param data 需要保存的数据 * @return 是否成功导出文件 */ public boolean export(String data){ //使用工厂方法 ExportFileApi api = factoryMethod(); return api.export(data); } /** * 工厂方法,创建导出的文件对象的接口对象 * @return 导出的文件对象的接口对象 */ protected abstract ExportFileApi factoryMethod(); }
package cn.javass.dp.factorymethod.example3; /** * 具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象 */ public class ExportDBOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成数据库备份文件形式的对象 return new ExportDB(); } }
package cn.javass.dp.factorymethod.example3; /** * 具体的创建器实现对象,实现创建导出成文本文件格式的对象 */ public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod() { //创建导出成文本文件格式的对象 return new ExportTxtFile(); } }
客户端的使用:
package cn.javass.dp.factorymethod.example3; public class Client { public static void main(String[] args) { //创建需要使用的Creator对象 ExportOperate operate = new ExportTxtFileOperate (); //调用输出数据的功能方法 operate.export("测试数据"); } }
站在客户端的角度来考虑,客户端需要使用Txt导出文件直接和工厂打交道new ExportTxtFileOperate ();,如果和db数据打交道,直接new ExportDBOperate ();
以上是关于设计模式--工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )