使用Java反射跟简单工厂模式改进抽象工厂模式

结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下:


去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。


代码示例:

1. 两个表User和Department的实体类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class User {  
  2.     private int id;  
  3.     private String userName;  
  4.       
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getUserName() {  
  12.         return userName;  
  13.     }  
  14.     public void setUserName(String userName) {  
  15.         this.userName = userName;  
  16.     }  
  17.     public User(int id, String userName) {  
  18.         super();  
  19.         this.id = id;  
  20.         this.userName = userName;  
  21.     }  
  22.     public User() {  
  23.         super();  
  24.         // TODO Auto-generated constructor stub  
  25.     }  
  26.     @Override  
  27.     public String toString() {  
  28.         return "User [id=" + id + ", userName=" + userName + "]";  
  29.     }  
  30.       
  31.       
  32. }  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Department {  
  2.   
  3.     private int id;  
  4.     private String deptName;  
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getDeptName() {  
  12.         return deptName;  
  13.     }  
  14.     public void setDeptName(String deptName) {  
  15.         this.deptName = deptName;  
  16.     }  
  17.     public Department() {  
  18.         super();  
  19.         // TODO Auto-generated constructor stub  
  20.     }  
  21.     public Department(int id, String deptName) {  
  22.         super();  
  23.         this.id = id;  
  24.         this.deptName = deptName;  
  25.     }  
  26.     @Override  
  27.     public String toString() {  
  28.         return "Department [deptName=" + deptName + ", id=" + id + "]";  
  29.     }  
  30.       
  31.       
  32. }  


2. 两个表操作的接口

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public interface IUserDao {  
  2.       
  3.     abstract void insert(User user);  
  4.     abstract User select(int id);  
  5.       
  6. }  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public interface IDepartmentDao {  
  2.   
  3.     abstract void insert(Department dept);  
  4.     abstract Department select(int id);  
  5. }  


3. IUserDao的MySQL实现和Oracle实现

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class UserMysqlImpl implements IUserDao {  
  2.   
  3.     @Override  
  4.     public void insert(User user) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("User: MySQL实现插入一条记录:"+user.toString());  
  7.     }  
  8.   
  9.     @Override  
  10.     public User select(int id) {  
  11.         // TODO Auto-generated method stub  
  12.         System.out.println("User: MySQL实现查询 :id = "+id);  
  13.         return null;  
  14.     }  
  15.   
  16. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class UserOracleImpl implements IUserDao {  
  2.   
  3.     @Override  
  4.     public void insert(User user) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("User: Oracle实现插入一条记录:"+user.toString());  
  7.     }  
  8.   
  9.     @Override  
  10.     public User select(int id) {  
  11.         // TODO Auto-generated method stub  
  12.         System.out.println("User: Oracle实现查询 :id = "+id);  
  13.         return null;  
  14.     }  
  15.   
  16. }  

4. IDepartmentDao的Mysql实现和oracle实现


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class DepartmentMySqlImpl implements IDepartmentDao {  
  2.   
  3.     @Override  
  4.     public void insert(Department dept) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("Department: MySQL实现插入一条记录." + dept.toString());  
  7.     }  
  8.   
  9.     @Override  
  10.     public Department select(int id) {  
  11.         // TODO Auto-generated method stub  
  12.         System.out.println("Department: MySQL查询记录 id = " + id);  
  13.         return null;  
  14.     }  
  15.   
  16. }  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class DepartmentOracleImpl implements IDepartmentDao{  
  2.   
  3.     @Override  
  4.     public void insert(Department dept) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("Department: Oracle实现插入一条记录." + dept.toString());  
  7.     }  
  8.   
  9.     @Override  
  10.     public Department select(int id) {  
  11.         // TODO Auto-generated method stub  
  12.         System.out.println("Department: Oracle实现查询一条记录 id = " + id);  
  13.         return null;  
  14.     }  
  15.   
  16. }  

5.DataAccess类

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class DataAccess {  
  2.   
  3.     private String db;  
  4.       
  5.     public IUserDao createUserDao()   
  6.                         throws ClassNotFoundException,   
  7.                                 InstantiationException,   
  8.                                 IllegalAccessException{  
  9.         if(db != null && !db.equals("")){  
  10.             //拼接字符串,注意类名包含包名  
  11.             String className = "com.design.abstractFactory.product.User" + db +"Impl";  
  12.             //获取以className字符串为名的类  
  13.             Class<IUserDao> userDaoImplClass   
  14.                     = (Class<IUserDao>) Class.forName(className);  
  15.             //返回类的实例  
  16.             return userDaoImplClass.newInstance();  
  17.         }  
  18.         return null;  
  19.     }  
  20.       
  21.     public IDepartmentDao createDepatDao()   
  22.                             throws ClassNotFoundException,  
  23.                                     InstantiationException,   
  24.                                     IllegalAccessException{  
  25.           
  26.         if(db != null && !db.equals("")){  
  27.             //拼接字符串,注意类名包括包名  
  28.             String className = "com.design.abstractFactory.product.Department" + db +"Impl";  
  29.             //获取以className字符串为名的类  
  30.             Class<IDepartmentDao> deptDaoImplClass   
  31.                         = (Class<IDepartmentDao>) Class.forName(className);  
  32.             //返回类的实例  
  33.             return deptDaoImplClass.newInstance();  
  34.         }  
  35.         return null;  
  36.     }  
  37.   
  38.     public String getDb() {  
  39.         return db;  
  40.     }  
  41.   
  42.     public void setDb(String db) {  
  43.         this.db = db;  
  44.     }  
  45.       
  46. }  

6. client端

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class abstractFactoryTest {  
  2.       
  3.     @Test  
  4.     public void testDataAccess() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{  
  5.         Properties proper = new Properties();  
  6.         InputStream is   
  7.             = this.getClass().getClassLoader().getResourceAsStream("DB.properties");  
  8.         proper.load(is);  
  9.         String db = proper.getProperty("db");  
  10.           
  11.         DataAccess dataAcc = new DataAccess();  
  12.         dataAcc.setDb(db);  
  13.           
  14.           
  15.         IUserDao userDao =  dataAcc.createUserDao();  
  16.         IDepartmentDao deptDao = dataAcc.createDepatDao();  
  17.           
  18.         User user = new User(1"pathfiner");  
  19.         Department dept = new Department(1"aaa");  
  20.           
  21.         userDao.insert(user);  
  22.         deptDao.select(1);  
  23.     }  
  24. }  

DB.properties

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. db=MySql
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值