23种设计模式-----单例模式

使用单例模式,是由于一个类的使用只需要创建一个对象,在项目运行的时候不需要过多的创建,过多的创建是很消耗资源的,例如mybatis连接数据库使用的sqlSessionFactory用户生产sqlSession的工程,创建一次就好,这就是单例

单例模式需要注意的关键:

1.将构造方法的修饰符设置为private

2.通过一个静态方法获取单例对象

3.确保单例类的对象有且只有一个,特别是在多线程的情况下

4.确保单例类对象在反序列化时不会重新构建对象

单例的实现模式

1.饿汉式:

public class SingleA {


    private static SingleA instance = new SingleA();
    
    //将构造函数私有化防止外界构造
    private SingleA(){
        
    }
    
    public static SingleA getInstance(){
         return instance;
    }
}

2.懒汉式:

public class SingleB {
  private static SingleB instance = null;
    
    //将构造函数私有化防止外界构造
    private SingleB(){
        
    }
    
    //获取SingletonB的唯一实例,用synchronized关键字保证某一时刻只有一个线程调用此方法。
    public static synchronized SingleB getInstance(){
        if(instance ==null){
            instance = new SingleB();
        }
         return instance;
    }

}

加上同步的方法保证了单例对象的唯一,只有使用时才会创建一定程度上节约了资源,但第一次使用时可能会慢,需要实例化嘛,还有在每次调用getInstance()方法时都需要同步,消耗了不必要的资源

3.DCL(Double CheckLock)单例化

public class SingleDcl {


  private static SingleDcl instance = null;
    
    //将构造函数私有化防止外界构造
    private SingleDcl(){
        
    }
    
    public static SingleDcl getInstance(){
        if(instance==null){
            synchronized  (SingleDcl.class){
                if(instance==null){
                    instance = new SingleDcl();
                }
            }
        }
        return instance;
    }

}

资源利用率高,只有使用时才会实例,又保证线程安全

4.静态内部类

public class SingleStatic {
    
    //将构造函数私有化防止外界构造
    private SingleStatic(){
        
    }
    
    public static SingleStatic getInstance(){
        return SingleStaticBuilder.instance;
    }
    
    /**
     * 静态内部类
     * 
     */
    private static class SingleStaticBuilder {
        private static SingleStatic instance = new SingleStatic();
    }

}

这种方法第一次加载SingleStatic时不会被加载,只有在第一次调用方法时,虚拟机就会加载SingleStaticBuilder 

初始化instance,这种方法既保证了线程安全,单例对象的唯一,也延迟了单例的初始化

5.简单的单例模式管理

public class SingleManager {


    private static Map map = new HashMap<>();
    
    //注入单例
    public static void registerService(String key ,Object instance){
        if (!map.containsKey(key)) {
            map.put(key, instance);
        }
    }
    
    //获取单例
    public static Object getService(String key){
        return map.get(key);
    }
}

你可能感兴趣的:(23种设计模式-----单例模式)