单例模式

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);
       }
   }
}
上一篇下一篇

猜你喜欢

热点阅读