很烂的水平,开始写博客,玩玩~~
现在看的是“传智”视频的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;
- }
- }
- 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."facotry" 对应的value
- String fs = prop.getProperty("factory");
- // 3.获得这个类 ---.Class和 Class.forName("")
- Class clz = Class.forName(fs);
- //4.获得clz的getInstance方法
- Method m = clz.getMethod("getInstance");
- 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;
- }
- }