spring第一節,初識IOC(三)


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):

概念:

把創建對象的權力交給框架/工廠,是框架的重要特徵,需要注意的是,這個並非面向對象的專業術語

目的:

削減計算機程序的耦合

發佈了12 篇原創文章 · 獲贊 13 · 訪問量 3517
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章