设计模式学习之简单工厂+反射+配置文件
来源:互联网 发布:visio网络图标库vss 编辑:程序博客网 时间:2024/05/17 06:35
3.用反射+配置文件的方法重新实现大话设计模式课本上15章15.7的例题
问题分析:相比抽象工厂,用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 stubSystem.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 stubSystem.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 stubreturn null;}public void insert(Department department) {// TODO Auto-generated method stubSystem.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 stubreturn null;}public void insert(Department department) {// TODO Auto-generated method stubSystem.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,这一点不符合开闭原则。显然使用反射+配置文件可以解决后者。
0 0
- 设计模式学习之简单工厂+反射+配置文件
- 设计模式学习之抽象工厂模式(二)<反射+配置文件>
- 设计模式---抽象工厂模式+反射+配置文件
- 设计模式学习之简单工厂模式
- 设计模式之简单工厂模式学习
- 设计模式学习之简单工厂模式
- 设计模式学习之简单工厂模式
- 设计模式学习之简单工厂模式
- 设计模式学习之工厂模式(简单工厂模式)
- 设计模式学习之简单工厂模式和工厂模式
- 设计模式学习之简单工厂、工厂方法、抽象工厂
- Java设计模式之工厂模式之简单工厂模式(通过反射)
- 配置文件+反射+简单工厂
- 设计模式学习之简单工厂模式和策略模式
- 设计模式之简单工厂模式,工厂模式,抽象工厂模式学习总结
- 设计模式之简单工厂模式,工厂模式,抽象工厂模式学习总结
- 设计模式学习(二)之工厂模式(简单工厂+工厂方法+抽象工厂)
- 简单工厂设计模式-反射机制
- WebRTC 学习笔记(2)--libjingle 部分 (P2P传输)
- 【ASP.NET】验证控件
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
- Behavioral模式之Observer模式
- 透过IT大佬的高考专业选择,你的兄弟姐妹可以取得哪些“真经”?
- 设计模式学习之简单工厂+反射+配置文件
- Javadoc详解(二)
- SAT阅读词汇总结:语气限定词
- Behavioral模式之Iterator模式
- SmartGit的安装和使用
- 压缩游戏包大小的几个方法
- java.lang.UnsatisfiedLinkError: org.jblas.NativeBlas.dposv(CII[DII[DII)I
- 使用 Redis 实现分布式系统轻量级协调技术
- SDWebImage基础应用