单例模式
2018-06-26 本文已影响0人
尘上的沙粒
一、什么是单例模式
形象的说,单例就是一个孤单的对象,孤独的存在着。比如生活中的不合群的人。从程序的角度来说,单例是一个只能拥有唯一对象的类,只能通过指定的方法去获取对象。不能通过new,反射获取对象实例。
二、为什么会有单例-解决了什么问题
在我们编程过程中,许多系统的资源都是共享的方式设计的,比如打印机可以存在多个任务,但是一次只能有一台打印机在进行打印。
单例的设计也就解决了某些情况下资源共享的问题,增强了程序的健壮性。
三、单例模式的特点以及使用场景
a 特点
1、只能有一个实例
2、只能自己创建实例
3 其他对象只能通过指定的方式获取实例
b 使用场景
操作系统中的日历、spring的IOC容器等等
四、如何实现
常用实现方式
a) 饿汉式
无论是不是使用,都先把对象给new出来,需要的时候直接返回。
优点:可以解决线程安全的问题
缺点:浪费资源,并且无法解决反射入侵的问题
b)懒汉式
需要的时候才创建,之后需要的时候直接返回。我目前常用的是这种场景。
优点:解决资源浪费的问题,特别是在有些需要占大量资源的情景。
缺点:可能有线程安全的问题,需要加synchronized关键字,并且无法解决反射入侵的问题
c)双重检查加锁
五 spring中的做法
Spring中的做法,就是用这种注册式单例
public class BeanFactory {
private BeanFactory(){}
//线程安全
private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>();
public static Object getBean(String className){
if(!ioc.containsKey(className)){
Object obj = null;
try {
obj = Class.forName(className).newInstance();
ioc.put(className,obj);
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}else{
return ioc.get(className);
}
}
}