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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章