抽象工厂模式(java)

本文详细介绍了在Java项目中使用抽象工厂模式处理跨数据库功能的方法,通过定义接口、实现不同数据库的DAO类、创建工厂类并配置数据库类型,实现了灵活地在不同数据库间切换操作,同时保持代码的复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  抽象工厂模式(java)

    

 

     刚才看了13shu的抽象工厂模式,感觉很不错,个人感觉通俗易懂,以前一直搞不明怎么回事,看了这篇文章,大致明白怎么回事了,接下来把这篇文章分享给大家。

 

工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准.

以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如Orale系列,MySql系列)

1.首先定义相关接口(与平常的做法没什么区别)

Java代码 复制代码  收藏代码
  1. // 角色表DAO接口   
  2. interface IroleDao {   
  3.     void insert();   
  4.   
  5.     void update();   
  6. }   
  7. // 用户表DAO接口   
  8. interface IuserDao {   
  9.     void find();   
  10.   
  11.     void delete();   
  12. }  

// 角色表DAO接口 interface IroleDao { void insert(); void update(); } // 用户表DAO接口 interface IuserDao { void find(); void delete(); }

 
 

 2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现

Java代码 复制代码  收藏代码
  1. // 用户表Oralce数据库DAO   
  2. class OracleuserDao implements IuserDao {   
  3.     public void delete() {   
  4.         System.out.println("Oralce 删除用户表数据");   
  5.     }   
  6.   
  7.     public void find() {   
  8.         System.out.println("Oralce 查询用户表数据");   
  9.     }   
  10. }   
  11.   
  12. // 用户表MySql数据库DAO   
  13. class MySqluserDao implements IuserDao {   
  14.     public void delete() {   
  15.         System.out.println("MySql 删除用户数据");   
  16.     }   
  17.   
  18.     public void find() {   
  19.         System.out.println("MySql 查询用户数据");   
  20.     }   
  21. }   
  22. // 角色表Oracle数据库DAO   
  23. class OracleroleDao implements IroleDao {   
  24.     public void insert() {   
  25.         System.out.println("Oralce 对角色表插入数据");   
  26.     }   
  27.   
  28.     public void update() {   
  29.         System.out.println("Oracle 对角色表更新数据");   
  30.     }   
  31. }   
  32.   
  33. // 角色表MySql数据库DAO   
  34. class MySqlroleDAO implements IroleDao {   
  35.     public void insert() {   
  36.         System.out.println("MySql 对角色表插入数据");   
  37.     }   
  38.   
  39.     public void update() {   
  40.         System.out.println("Mysql 对角色表更新数据");   
  41.     }   
  42. }  

// 用户表Oralce数据库DAO class OracleuserDao implements IuserDao { public void delete() { System.out.println("Oralce 删除用户表数据"); } public void find() { System.out.println("Oralce 查询用户表数据"); } } // 用户表MySql数据库DAO class MySqluserDao implements IuserDao { public void delete() { System.out.println("MySql 删除用户数据"); } public void find() { System.out.println("MySql 查询用户数据"); } } // 角色表Oracle数据库DAO class OracleroleDao implements IroleDao { public void insert() { System.out.println("Oralce 对角色表插入数据"); } public void update() { System.out.println("Oracle 对角色表更新数据"); } } // 角色表MySql数据库DAO class MySqlroleDAO implements IroleDao { public void insert() { System.out.println("MySql 对角色表插入数据"); } public void update() { System.out.println("Mysql 对角色表更新数据"); } }

 
 

这里增加了一套DAO的实现 (与平时有所不同,如果有10个数据库就要加上10种不同的实现,比较麻烦呀)

3.定义DAO工厂接口与实现(利用java反射机制生产出你需要的DAO如:userDAO,roleDao)

Java代码 复制代码  收藏代码
  1. // DAO工厂   
  2. abstract class DaoFactory {   
  3.     public static DaoFactory getInstance(String classname) {   
  4.         DaoFactory dao = null;   
  5.         try {   
  6.             dao = (DaoFactory) Class.forName(classname).newInstance();   
  7.         } catch (Exception e) {   
  8.             e.printStackTrace();   
  9.         }   
  10.         return dao;   
  11.     }   
  12.   
  13.     abstract IuserDao getuserdao();   
  14.   
  15.     abstract IroleDao getroledao();   
  16. }   
  17.   
  18. // Oralce工厂   
  19. class OracleFactory extends DaoFactory {   
  20.     public IroleDao getroledao() {   
  21.         return new OracleroleDao();   
  22.     }   
  23.     public IuserDao getuserdao() {   
  24.         return new OracleuserDao();   
  25.     }   
  26. }   
  27.   
  28. // MySql工厂   
  29. class MysqlFactory extends DaoFactory {   
  30.     public IroleDao getroledao() {   
  31.         return new MySqlroleDAO();   
  32.     }   
  33.     public IuserDao getuserdao() {   
  34.         return new MySqluserDao();   
  35.     }   
  36. }  

// DAO工厂 abstract class DaoFactory { public static DaoFactory getInstance(String classname) { DaoFactory dao = null; try { dao = (DaoFactory) Class.forName(classname).newInstance(); } catch (Exception e) { e.printStackTrace(); } return dao; } abstract IuserDao getuserdao(); abstract IroleDao getroledao(); } // Oralce工厂 class OracleFactory extends DaoFactory { public IroleDao getroledao() { return new OracleroleDao(); } public IuserDao getuserdao() { return new OracleuserDao(); } } // MySql工厂 class MysqlFactory extends DaoFactory { public IroleDao getroledao() { return new MySqlroleDAO(); } public IuserDao getuserdao() { return new MySqluserDao(); } }

 
 

  

4. 定义配置文件

Java代码 复制代码  收藏代码
  1. class Config {   
  2.     // Oralce   
  3.     static final String ORALCE = "org.abc.OracleFactory";   
  4.   
  5.     static final String MYSQL = "org.abc.MysqlFactory";   
  6. }  

class Config { // Oralce static final String ORALCE = "org.abc.OracleFactory"; static final String MYSQL = "org.abc.MysqlFactory"; }

 
 

 

 配置文件可以定义到XML中去(好处:修改配置项之后不需要对JAVA文件进行编译.)

5.测试你的输出的DAO

Java代码 复制代码  收藏代码
  1. public class Dao {   
  2.     public static void main(String[] args) {   
  3.         DaoFactory.getInstance(Config.ORALCE).getroledao().insert();   
  4.         DaoFactory.getInstance(Config.MYSQL).getroledao().insert();   
  5.     }   
  6.   
  7. }  

public class Dao { public static void main(String[] args) { DaoFactory.getInstance(Config.ORALCE).getroledao().insert(); DaoFactory.getInstance(Config.MYSQL).getroledao().insert(); } }

 
 

  

总结

使用条件:一系列接口有一系列的实现
如上IuserDao、IroleDao等一系列的接口,他们可以有一系列的实现(Oracle方式、MySql方式)

OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
组成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列实现:Oracle系列、MySql系列
系列工厂类:Oracle系列工厂类、MySql系列工厂类(必须继承抽象工厂类)
抽象工厂类:DaoFactory

 

 

 

 

转自:http://13shu.iteye.com/blog/200119

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值