cl_303303303 发表于 2015-11-9 10:04:34

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

  很烂的水平,开始写博客,玩玩~~
  现在看的是“传智”视频的Mybatis部分,里面有个关于OCP的工厂设计。里面讲的dao工厂,用到了“反射机制”,所以觉得很有必要学学。
  OCP(Open-Closed principle),一个好的设计应该能够容纳新的功能需求的增加,但是增加的方式不是通过修改又有的模块(类),而是通过增加新的模块(类)来完成的,也就是在设计的时候,所有软件组成实体包括接口,函数,函数等必须是可扩展但不可修改的。

一个好的设计应该能够容纳新的功能需求的增加,
但是增加的
方式不是通过修改又有的模块(类)
,而是通过增加新的模块(类)来完成的,
也就是在设计的时候,
所有软件组成实体包括接口,
函数,
函数等必须是可扩展
但不可修改的。
  简单的说就是对增加开放,对修改关闭。因此我们设计时要基于“面向接口”编程。
  1. dao.properties
内容为factory
Dao的地址

  2. PropertiesUtil 解析工具类

  

[*]public class PropertiesUtil {
[*]private static Properties props = null;
[*]private static InputStream ins = null;//输入流
[*]static {
[*]ins = PropertiesUtil.class.getClassLoader().getResourceAsStream(
[*]"dao.properties");
[*]}
[*]
[*]public static Properties getDaoProp() {
[*]try {
[*]if (props == null) {
[*]props = new Properties();
[*]}
[*]props.load(ins);//加载
[*]} catch (IOException e) {
[*]e.printStackTrace();
[*]}
[*]return props;
[*]}
[*]
[*]}
[*]
3.写一个接口IFactoryDao,根据不同的名称获得不同的Dao
  

[*]public interface IFactoryDao {
[*]//根据传入的name读取 dao.properties对应的key,找到对应的value,获得相应的dao类实例
[*]public Object getDao(String name);
[*]}
  
  4.PropertiesDao实现IFactoryDao接口
  public class PropertiesFactory implements IFactoryDao {




[*]private static IFactoryDao f = new PropertiesFactory();
[*]
[*]private Map<String,Object> daos = new HashMap<String,Object>();
[*]
[*]//单例模式
[*]public static IFactoryDao getInstance() {
[*]return f;
[*]}
[*]//实现getDao方法
[*]public Object getDao(String name) {
[*]if(daos.containsKey(name)){
[*]return daos.get(name);
[*]}
[*]try {
[*]// 1.读取properties
[*]Properties props = PropertiesUtil.getDaoProp();
[*]// 2.根据name获得key
[*]String daoName = props.getProperty(name);
[*]// 3.创建dao实例---用到反射机制
[*]Object daoObj = Class.forName(daoName).newInstance();
[*]daos.put(name, daoObj);
[*]return daoObj;
[*]} catch (InstantiationException e) {
[*]e.printStackTrace();
[*]} catch (IllegalAccessException e) {
[*]e.printStackTrace();
[*]} catch (ClassNotFoundException e) {
[*]e.printStackTrace();
[*]}
[*]return null;
[*]}
[*]
[*]
[*]}
  
  5.daoUtil 工具类 实现创建工厂方法
  

[*]public class DaoUtil {
[*]public static IFactoryDao createDaoFactory() {
[*]IFactoryDao f = null;
[*]try {
[*]// 1.读取.properties
[*]Properties prop = PropertiesUtil.getDaoProp();
[*]// 2.&quot;facotry&quot; 对应的value
[*]String fs = prop.getProperty(&quot;factory&quot;);
[*]// 3.获得这个类 ---.Class和 Class.forName(&quot;&quot;)
[*]Class clz = Class.forName(fs);
[*]//4.获得clz的getInstance方法
[*]Method m = clz.getMethod(&quot;getInstance&quot;);
[*]f = (IFactoryDao)m.invoke(clz);
[*]} catch (ClassNotFoundException e) {
[*]e.printStackTrace();
[*]} catch (SecurityException e) {
[*]e.printStackTrace();
[*]} catch (NoSuchMethodException e) {
[*]e.printStackTrace();
[*]} catch (IllegalArgumentException e) {
[*]e.printStackTrace();
[*]} catch (IllegalAccessException e) {
[*]e.printStackTrace();
[*]} catch (InvocationTargetException e) {
[*]// TODO Auto-generated catch block
[*]e.printStackTrace();
[*]}
[*]return f;
[*]}
[*]}
[*]
  
  

  

  
  

  
         版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: Mybatis学习1----基于OCP的最简便dao工厂