工廠模式: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();