使用工廠模式解耦。 一、需求場景: 某一層功能需要改動,但其他層代碼不變 實現類1: 查詢自己的資料庫. ====改為==== 實現類2: 從其它地址得到數據. 二、步驟: 1.創建一個 類,Bean工廠 2.解決硬編碼問題,進一步優化解耦 提供一個配置文件: 內容: 三、理論 1.導入 使用介面開 ...
使用工廠模式解耦。
一、需求場景:
某一層功能需要改動,但其他層代碼不變
實現類1:
MyDaoImpl
查詢自己的資料庫.====改為====>
實現類2:
MyDaoImpl2
從其它地址得到數據.
二、步驟:
1.創建一個BeanFactory
類,Bean工廠
service層:
private MyDao dao = BeanFactory.getBean();
class BeanFactory{
public static Object getBean(){
Class clazz = Class.forName("com.mysite.dao.impl.MyDaoImpl");//有硬編碼問題
Object obj =clazz,newInstance();
return obj;
}
}
2.解決硬編碼問題,進一步優化解耦
提供一個配置文件:
beans.properties
內容:
myDao=com.mysite.dao.impl.MyDaoImpl2
//解決硬編碼問題,進一步解耦
service層
private MyDao dao = BeanFactory.getBean("myDao");
class BeanFactory{
public static Object getBean(String key){
//讀取beans.properties文件,得到Properties properties;
Properties properties = BeanFactory.class.
String clazzName = properties.getProperty(key);
Class clazz = Class.forName(clazzName);
Object obj = clazz.newInstance();
}
}
三、理論
1.導入-----使用介面開發:
- 好處:方便進行功能拓展,提供新的實現類,提供新功能
- 問題:service層里創建dao對象的代碼需要隨之調整
- 層與層之間耦合性比較強
2.解決思路:
- 在service層創建對象時,使用反射創建對象,
- 提供一個配置文件: key對應
dao的全限定類名
- 想創建什麼
dao
,就提供一個key,通過BeanFactory
類得到key對應的dao
對象. - 好處:
dao
再拓展,又增加了新的實現類.我們只需要修改配置文件即可.- 其它service代碼、
BeanFactory
代碼都不需要變更.
- 耦合性降低了
3.工廠模式
Spring框架的兩大核心
IoC
:Inversion of Control,控制反轉,解耦
- 由原來主動創建對象,變成被動接收對象.把創建對象的控制權交出去了.