Mybatis学习1----基于OCP的最简便dao工厂

很烂的水平,开始写博客,玩玩~~

现在看的是“传智”视频的Mybatis部分,里面有个关于OCP的工厂设计。里面讲的dao工厂,用到了“反射机制”,所以觉得很有必要学学。

OCP(Open-Closed principle),一个好的设计应该能够容纳新的功能需求的增加,但是增加的方式不是通过修改又有的模块(类),而是通过增加新的模块(类)来完成的,也就是在设计的时候,所有软件组成实体包括接口,函数,函数等必须是可扩展但不可修改的。

一个好的设计应该能够容纳新的功能需求的增加,

但是增加的

方式不是通过修改又有的模块(类)

,而是通过增加新的模块(类)来完成的,

也就是在设计的时候,

所有软件组成实体包括接口,

函数,

函数等必须是可扩展

但不可修改的。

简单的说就是对增加开放,对修改关闭。因此我们设计时要基于“面向接口”编程。

1. dao.properties
内容为factory
Dao的地址

2. PropertiesUtil 解析工具类

  1. public class PropertiesUtil {
  2. private static Properties props = null;
  3. private static InputStream ins = null;//输入流
  4. static {
  5. ins = PropertiesUtil.class.getClassLoader().getResourceAsStream(
  6. "dao.properties");
  7. }

  8. public static Properties getDaoProp() {
  9. try {
  10. if (props == null) {
  11. props = new Properties();
  12. }
  13. props.load(ins);//加载
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. return props;
  18. }

  19. }
3.写一个接口IFactoryDao,根据不同的名称获得不同的Dao

  1. public interface IFactoryDao {
  2. //根据传入的name读取 dao.properties对应的key,找到对应的value,获得相应的dao类实例
  3. public Object getDao(String name);
  4. }

4.PropertiesDao实现IFactoryDao接口

public class PropertiesFactory implements IFactoryDao {


  1. private static IFactoryDao f = new PropertiesFactory();
  2. private Map<String,Object> daos = new HashMap<String,Object>();
  3. //单例模式
  4. public static IFactoryDao getInstance() {
  5. return f;
  6. }
  7. //实现getDao方法
  8. public Object getDao(String name) {
  9. if(daos.containsKey(name)){
  10. return daos.get(name);
  11. }
  12. try {
  13. // 1.读取properties
  14. Properties props = PropertiesUtil.getDaoProp();
  15. // 2.根据name获得key
  16. String daoName = props.getProperty(name);
  17. // 3.创建dao实例---用到反射机制
  18. Object daoObj = Class.forName(daoName).newInstance();
  19. daos.put(name, daoObj);
  20. return daoObj;
  21. } catch (InstantiationException e) {
  22. e.printStackTrace();
  23. } catch (IllegalAccessException e) {
  24. e.printStackTrace();
  25. } catch (ClassNotFoundException e) {
  26. e.printStackTrace();
  27. }
  28. return null;
  29. }


  30. }

5.daoUtil 工具类 实现创建工厂方法

  1. public class DaoUtil {
  2. public static IFactoryDao createDaoFactory() {
  3. IFactoryDao f = null;
  4. try {
  5. // 1.读取.properties
  6. Properties prop = PropertiesUtil.getDaoProp();
  7. // 2."facotry" 对应的value
  8. String fs = prop.getProperty("factory");
  9. // 3.获得这个类 ---.Class和 Class.forName("")
  10. Class clz = Class.forName(fs);
  11. //4.获得clz的getInstance方法
  12. Method m = clz.getMethod("getInstance");
  13. f = (IFactoryDao)m.invoke(clz);
  14. } catch (ClassNotFoundException e) {
  15. e.printStackTrace();
  16. } catch (SecurityException e) {
  17. e.printStackTrace();
  18. } catch (NoSuchMethodException e) {
  19. e.printStackTrace();
  20. } catch (IllegalArgumentException e) {
  21. e.printStackTrace();
  22. } catch (IllegalAccessException e) {
  23. e.printStackTrace();
  24. } catch (InvocationTargetException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. return f;
  29. }
  30. }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值