设计模式--工厂模式
我们来看一下不是有工厂模式的代码
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 ();
posted on 2017-07-30 17:11 luzhouxiaoshuai 阅读(149) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!