工厂模式:http://baike.baidu.com/view/1306799.htm
参考博客一篇:http://blog.csdn.net/janepen/article/details/6470471
我在一个类中要调用一个Dao的接口,需要先实例一个实现了Dao接口的类的对象。关于这个Dao的实现类我只知道之后有可能会用JDBC实现也有可能用Hibernate实现,为了之后不再修改代码。
1,我将实现类的相关信息放在了一个daoconfig.properties文件中,内容:userDaoClass=cn.itcast.jdbc.dao.impl.UserDaoJdbcImpl。等号后边的部分可以根据需求修改成Hibernate。
2,然后在需要实例化对象的地方:“UserDao userDao = ;”等号的右边根据这个配置文件来内容来进行实例化,但是直接在当前类中写起来不方便维护,而且有可能在别的地方也要使用UserDao,对于UserDao来说没必要创建很多实例,一个就足够了,所以我把这些封装起来,用一个工厂类实现:
public class DaoFactory {
private static UserDao userDao = null;//如果是static顺序一定要在前,不用static也能保证只有一个实例
private static DaoFactory instance = new DaoFactory();//顺序不能和第一行交换,否则userDao在经历了构造方法之后又会被赋值null
private DaoFactory() {
try {
Properties prop = new Properties();
InputStream inStream = DaoFactory.class.getClassLoader()
.getResourceAsStream("daoconfig.properties");//在此使用其配置文件中的内容
prop.load(inStream);
String userDaoClass = prop.getProperty("userDaoClass");
Class clazz = Class.forName(userDaoClass);
userDao = (UserDao) clazz.newInstance();
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}
public static DaoFactory getInstance() {
return instance;
}
public UserDao getUserDao() {
return userDao;
}
}
这样实例化对象就简单了:UserDao userDao = DaoFactory.getInstance().getUserDao();