layout: post
author: zjhChester
header-img: img/post-bg-universe.jpg
catalog: true
tags:
- 工廠模式
單例模式(優化工廠模式):
簡述:
上一步的工廠模式是多例模式,多個線程訪問時會耗費資源;
單例:
1、單例對象只被創建一次,從而類中的成員也只會被初始化一次;
2、效率比多例高
3、反射的newInstance()每次都會調用默認的構造方法創建實例
修改
思路:
將反射的newInstance()方法只調用一次,而不是反覆創建新對象
實現:
1、創建beans(HashMap)容器存放掃描配置文件中的所有key和對象
//創建beans容器存放配置文件中所有的bean
private static Map<String,Object> beans;
2、修改BeanFactory中靜態方法,使每個key只會被newInstance實例化一次對象:
//實例化beans容器
beans = new HashMap<>();
//從配置文件中掃描所有的key
Enumeration<Object> keys = properties.keys();
//遍歷配置文件中的所有key 並存放進beans集合作爲取bean的容器
while(keys.hasMoreElements()){
//獲取配置文件中所有的key值
String key = keys.nextElement().toString();
//通過key值獲取需要實例化對象的全限定類名(配置文件的value)
String beanPath = properties.getProperty(key);
//通過類的全限定類名通過反射的方式創建對象
Object bean = Class.forName(beanPath).newInstance();
//將配置文件中的key 和 通過全限定類名反射實例化的對象裝入beans容器
beans.put(key,bean);
3、修改getbean()方法,每次只會從已經實例化好的beans容器中取值:
public static Object getBean(String beanName){
return beans.get(beanName);
}
4、修改測試主類代碼,測試創建的對象是否單例:
for (int i = 0; i < 5; i++) {
Service service = (Service) BeanFactory.getBean("Service");
System.out.println(service);
}
5、結果:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-41PF2JIU-1580545942891)(/mdImg/工廠模式改進(單例模式).assets/1569426347485.png)]
IOC(Inversion Of Control):
概念:
把創建對象的權力交給框架/工廠,是框架的重要特徵,需要注意的是,這個並非面向對象的專業術語
目的:
削減計算機程序的耦合