设计模式学习之简单工厂+反射+配置文件
2015-06-23 14:16
645 查看
3.用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题
问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的。
UML图:
1.实现了组件的封装,然后让组件外部能真正面向接口编程。
2.通过简单工厂,实现了客户端和具体实现类的解耦。
缺点:不方便扩展子工厂,如果要增加oracle数据库,必须在DateAccess类中增加oracle的方法,在工厂中增加创建case,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。
问题分析:相比抽象工厂,用DataAccess类代替了工厂接口以及工厂类,再加上使用反射+配置文件的方式,可以做到不对编译好的程序作出改变就能修改数据库种类,客户端可以只是用DateAccess进行数据库访问实例的创建,达到了解耦的目的。
UML图:
package com.cmc; //用户数据类 public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.cmc; //部门数据类 public class Department { int id; String dept_name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDept_name() { return dept_name; } public void setDept_name(String dept_name) { this.dept_name = dept_name; } } package com.cmc; //用户数据库操作的接口 public interface IUser { void insert(User user); User getUser(int id); } package com.cmc; //部门数据库操作接口 public interface IDepartment { void insert(Department department); Department getDepartment(int id); } package com.cmc; //在SqlServer中实现对用户数据库的操作 public class SqlserverUser implements IUser { public User getUser(int id) { System.out.println("在SQL Server中根据ID得到一条记录"); return null; } public void insert(User u) { // TODO Auto-generated method stub System.out.println("在SQL Server 中给user表添加一条记录"); } } package com.cmc; //在Access中实现对用户数据库的操作 public class AccessUser implements IUser { public User getUser(int id) { System.out.println("在Access中根据ID得到一条记录"); return null; } public void insert(User user) { // TODO Auto-generated method stub System.out.println("在Access中给user表添加一条记录"); } } package com.cmc; public class SqlserverDepartment implements IDepartment { public Department getDepartment(int id) { System.out.println("在SQL Server中根据ID得到一条记录"); // TODO Auto-generated method stub return null; } public void insert(Department department) { // TODO Auto-generated method stub System.out.println("在SQL Server 中给Department表添加一条记录"); } } package com.cmc; public class AccessDepartment implements IDepartment { public Department getDepartment(int id) { System.out.println("在Access中根据ID得到一条记录"); // TODO Auto-generated method stub return null; } public void insert(Department department) { // TODO Auto-generated method stub System.out.println("在Access中给Department表添加一条记录"); } } package com.cmc; //通过配置文件+反射对要创建的类进行切换 import java.io.IOException; import java.util.Properties; import config.RunMain; public class DataAccess { public static IUser CreatUser(){ IUser result = null; Properties prop = new Properties(); try { prop.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties")); Class db = Class.forName("com.cmc."+prop.getProperty("dbuser")); result = (IUser)db.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } public static IDepartment CreatDepartment(){ IDepartment result = null; Properties properties = new Properties(); try { properties.load(RunMain.class.getResourceAsStream("/com/cmc/datebase.properties")); Class db = Class.forName("com.cmc."+properties.getProperty("dbdepartment")); result=(IDepartment)db.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } }优点:
1.实现了组件的封装,然后让组件外部能真正面向接口编程。
2.通过简单工厂,实现了客户端和具体实现类的解耦。
缺点:不方便扩展子工厂,如果要增加oracle数据库,必须在DateAccess类中增加oracle的方法,在工厂中增加创建case,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。
相关文章推荐
- UVa 10739 - String to Palindrome
- Behavioral模式之Observer模式
- Javadoc详解(二)
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
- Flex4+BlazeDS+Spring+Hibernate 整合
- java 免费发送短信实例程序
- 巧克力爱好者匿名顺序图——管理员
- c#实现统计代码执行时间
- android属性动画详解2
- 派生类向基类转换的可访问性
- 【读书笔记:C++ primer plus 第六版 中文版】第8章 函数探幽
- [trouble-shooting]android 无法启动X86模式虚拟机的问题解决。
- 如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
- Eclipse的ADT插件提示版本问题的解决办法
- python多线程编程----threading模块
- TCP 连接断连问题剖析
- Android Animation学习笔记
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
- 免安装版Tomcat配置用户登录项目管理界面
- 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码