结合Java反射用简单工厂模式改进抽象工厂模式
来源:互联网 发布:在线ps网站源码 编辑:程序博客网 时间:2024/06/05 21:53
前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下:
去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。
代码示例:
1. 两个表User和Department的实体类
public class User {private int id;private String userName;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public User(int id, String userName) {super();this.id = id;this.userName = userName;}public User() {super();// TODO Auto-generated constructor stub}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + "]";}}
public class Department {private int id;private String deptName;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}public Department() {super();// TODO Auto-generated constructor stub}public Department(int id, String deptName) {super();this.id = id;this.deptName = deptName;}@Overridepublic String toString() {return "Department [deptName=" + deptName + ", id=" + id + "]";}}
public interface IUserDao {abstract void insert(User user);abstract User select(int id);}
public interface IDepartmentDao {abstract void insert(Department dept);abstract Department select(int id);}
public class UserMysqlImpl implements IUserDao {@Overridepublic void insert(User user) {// TODO Auto-generated method stubSystem.out.println("User: MySQL实现插入一条记录:"+user.toString());}@Overridepublic User select(int id) {// TODO Auto-generated method stubSystem.out.println("User: MySQL实现查询 :id = "+id);return null;}}
public class UserOracleImpl implements IUserDao {@Overridepublic void insert(User user) {// TODO Auto-generated method stubSystem.out.println("User: Oracle实现插入一条记录:"+user.toString());}@Overridepublic User select(int id) {// TODO Auto-generated method stubSystem.out.println("User: Oracle实现查询 :id = "+id);return null;}}
4. IDepartmentDao的Mysql实现和oracle实现
public class DepartmentMySqlImpl implements IDepartmentDao {@Overridepublic void insert(Department dept) {// TODO Auto-generated method stubSystem.out.println("Department: MySQL实现插入一条记录." + dept.toString());}@Overridepublic Department select(int id) {// TODO Auto-generated method stubSystem.out.println("Department: MySQL查询记录 id = " + id);return null;}}
public class DepartmentOracleImpl implements IDepartmentDao{@Overridepublic void insert(Department dept) {// TODO Auto-generated method stubSystem.out.println("Department: Oracle实现插入一条记录." + dept.toString());}@Overridepublic Department select(int id) {// TODO Auto-generated method stubSystem.out.println("Department: Oracle实现查询一条记录 id = " + id);return null;}}
5.DataAccess类
public class DataAccess {private String db;public IUserDao createUserDao() throws ClassNotFoundException, InstantiationException, IllegalAccessException{if(db != null && !db.equals("")){//拼接字符串,注意类名包含包名String className = "com.design.abstractFactory.product.User" + db +"Impl";//获取以className字符串为名的类Class<IUserDao> userDaoImplClass = (Class<IUserDao>) Class.forName(className);//返回类的实例return userDaoImplClass.newInstance();}return null;}public IDepartmentDao createDepatDao() throws ClassNotFoundException,InstantiationException, IllegalAccessException{if(db != null && !db.equals("")){//拼接字符串,注意类名包括包名String className = "com.design.abstractFactory.product.Department" + db +"Impl";//获取以className字符串为名的类Class<IDepartmentDao> deptDaoImplClass = (Class<IDepartmentDao>) Class.forName(className);//返回类的实例return deptDaoImplClass.newInstance();}return null;}public String getDb() {return db;}public void setDb(String db) {this.db = db;}}
6. client端
public class abstractFactoryTest {@Testpublic void testDataAccess() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{Properties proper = new Properties();InputStream is = this.getClass().getClassLoader().getResourceAsStream("DB.properties");proper.load(is);String db = proper.getProperty("db");DataAccess dataAcc = new DataAccess();dataAcc.setDb(db);IUserDao userDao = dataAcc.createUserDao();IDepartmentDao deptDao = dataAcc.createDepatDao();User user = new User(1, "pathfiner");Department dept = new Department(1, "aaa");userDao.insert(user);deptDao.select(1);}}
DB.properties
db=MySql
0 0
- 结合Java反射用简单工厂模式改进抽象工厂模式
- 简单工厂模式+反射来改进抽象工厂模式
- 使用Java反射跟简单工厂模式改进抽象工厂模式
- Java--用简单工厂来改进抽象工厂(反射)
- java工厂模式-简单工厂,工厂方法,抽象工厂模式
- 工厂模式 + 反射改进
- 大话设计模式-抽象工厂模式-简单工厂模式结合
- 设计模式之用反射机制改进的抽象工厂
- Java工厂模式(简单工厂、工厂方法、抽象工厂)
- 抽象工厂模式+反射
- 简单工厂模式、工厂方法模式、反射工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 设计模式_改进策略模式_策略模式与简单工厂模式结合(Java)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- 图结构练习——最小生成树
- Myeclipse导入Spring源码后少jar包问题--使用Jar命令重新打包
- hadoop入门之wordcount小案例
- npm install 出错
- android所有布局
- 结合Java反射用简单工厂模式改进抽象工厂模式
- 149.Shuffle an Array
- 【Spark Java API】Transformation(7)—cogroup、join
- 关于OC常用字符串函数介绍
- 集合框架_01_集合框架的构成及分类
- UVALive 6378 Friend Chains (多源最短路 spfa)
- strrev函数
- android 去掉ScrollVIew拉到尽头时再拉的阴影效果
- CAFFE 学习(1). 参考网站和资料