单例模式(优化工厂模式):
简述:
上一步的工厂模式是多例模式,多个线程访问时会耗费资源;
单例:
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、结果:
IOC(Inversion Of Control):
概念:
把创建对象的权力交给框架/工厂,是框架的重要特征,需要注意的是,这个并非面向对象的专业术语
目的:
削减计算机程序的耦合