单例模式

一般分为 饿汉式 懒汉式 线程不安全的 线程安全的 以及内部类形式的单例。

为什么使用单例?好处呢?

因为单例在内存中只有一个实例,减少内存的开销。主要一般适用于一个对象需要频繁的创建、销毁,而且无法优化创建和销毁时的性能。避免对资源的多重占用。可以全局调用。

缺点?

  • 单例模式一般没有接口,扩展很困难,基本都是修改代码实现。
  • 与单一指责原则冲突。
  • 对测试不利
  1. 饿汉式 一步到位 类初始化时,就实例化instance

    private static SingletonDesign instance = new SingletonDesign();

    private SingletonDesign(){

    }
    public static SingletonDesign getInstance(){
        return instance;
    }
  1. 懒汉式 (线程不安全的)为什么不安全,是因为如果多个线程同时创建单例,则会失效,可能创建多个instance。
private static SingletonDesign instance = null;

    private SingletonDesign(){

    }
    public static SingletonDesign getInstance(){
        if (instance == null){
            instance = new SingletonDesign();
        }
        return instance;
    }

3 懒汉式(线程安全的)但是因为加了synchronized 所以效率低。

private static SingletonDesign instance = null;

    private SingletonDesign(){

    }

    public synchronized static SingletonDesign getInstance(){
        if (instance == null){
            instance = new SingletonDesign();
        }
        return instance;
    }

4 静态内部类 比饿汉式效率稍微高点,因为这种开始并不一定会获取instance,而是去调用getInstance时候才去实例化instance

private static class Singletonholder{
        private static final SingletonDesign instance= new SingletonDesign();


    }
    private SingletonDesign(){

    }
    public static final SingletonDesign getInstance(){
        return Singletonholder.instance;
    }

5 双重锁单例 懒汉线程安全版的升级

private volatile static SingletonDesign instance = null;

    private SingletonDesign(){

    }

    public  static SingletonDesign getInstance(){
        if (instance == null){
            synchronized (SingletonDesign.class){
                if (instance == null){
                    instance = new SingletonDesign();
                }
            }

        }
        return instance;
    }

设计模式之禅

常见的几种单例模式

标签: none

仅有一条评论

  1. test test

    test!

添加新评论