使用單例和工廠設計模式實現dao實現層的解耦
阿新 • • 發佈:2019-02-03
建立Dao具體例項的工廠:
工廠解耦: 只需在配置檔案中改動,而不需要修改原始碼
各層之間耦合性極低
使用的設計模式: 單例 和 工廠
*******************************************************************************************
src下面建立一個檔案dao.properties
userDao=com.itheima.dao.impl.UserDaoMySQLImpl1(實現類的路徑)
*******************************************************************************************
public class DaoFactory {
// 使用餓漢式建立單例類
private static DaoFactory instance = new DaoFactory();
private DaoFactory(){}
public static DaoFactory getInstance(){
return instance;
}
// spring的設計思想
// 讀取配置檔案中輸入的Dao實現方式類的全名稱來設定Dao的實現方式
private static String userDaoImplClassName;
static{
try {
InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");
Properties props = new Properties();
props.load(in);
userDaoImplClassName = props.getProperty("userDao");
} catch (IOException e) {
e.printStackTrace();
}
}
// 使用工廠設計模式來獲取Dao的多種實現方式
public UserDao getUserDao(){
try {
return (UserDao) Class.forName(userDaoImplClassName).newInstance();
}catch(Exception e) {
throw new RuntimeException(e);
}
}
}
*******************************************************************************************
有三個dao實現類:
UserDaoDom4jImpl
UserDaoMySQLImpl
UserDaoMySQLImpl1
通過工廠修改service實現呼叫的dao介面即可,如下:
// 使用修改配置檔案中dao實現方式的類名稱來獲取dao的實現方式
private UserDao dao = DaoFactory.getInstance().getUserDao();
*******************************************************************************************
工廠解耦: 只需在配置檔案中改動,而不需要修改原始碼
各層之間耦合性極低
使用的設計模式: 單例 和 工廠
*******************************************************************************************
src下面建立一個檔案dao.properties
userDao=com.itheima.dao.impl.UserDaoMySQLImpl1(實現類的路徑)
*******************************************************************************************
public class DaoFactory {
// 使用餓漢式建立單例類
private static DaoFactory instance = new DaoFactory();
private DaoFactory(){}
public static DaoFactory getInstance(){
return instance;
}
// spring的設計思想
// 讀取配置檔案中輸入的Dao實現方式類的全名稱來設定Dao的實現方式
private static String userDaoImplClassName;
static{
try {
InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");
Properties props = new Properties();
props.load(in);
userDaoImplClassName = props.getProperty("userDao");
} catch (IOException e) {
e.printStackTrace();
}
}
// 使用工廠設計模式來獲取Dao的多種實現方式
public UserDao getUserDao(){
try {
return (UserDao) Class.forName(userDaoImplClassName).newInstance();
}catch(Exception e) {
throw new RuntimeException(e);
}
}
}
*******************************************************************************************
有三個dao實現類:
UserDaoDom4jImpl
UserDaoMySQLImpl
UserDaoMySQLImpl1
通過工廠修改service實現呼叫的dao介面即可,如下:
// 使用修改配置檔案中dao實現方式的類名稱來獲取dao的實現方式
private UserDao dao = DaoFactory.getInstance().getUserDao();
*******************************************************************************************