单例设计模式总结

最近看到一篇关于单例模式较为详细的讲解的文章:https://coolshell.cn/articles/265.html 下面对此文章进行摘录 (Java)

// version 1.0 最为朴素的单例模式实践;
public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {  }
    public static Singleton getInstance() {
        if (singleton== null) {
            singleton= new Singleton();
        }
        return singleton;
    }
}

singleton特点:

  1. 私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。
  2. 即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。
  3. 在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。
  4. 所形成的实例保存在自己类中的私有成员中。
  5. 我们取实例时,只需要使用Singleton.getInstance()就行了。

singleton多线程版本优化:

// version 1.4 多线程强化版本,使用双重检查和 volatile 进行屏蔽多线程作用;
public class Singleton
{
    private volatile static Singleton singleton = null;
    private Singleton()  {    }
    public static Singleton getInstance()   {
        if (singleton== null)  {
            synchronized (Singleton.class) {
                if (singleton== null)  {
                    singleton= new Singleton();
                }
            }
        }
        return singleton;
    }
}
// version 1.5 把类的创建委托给类装载器来进行创建;
public class Singleton
{
    private volatile static Singleton singleton = new Singleton();
    private Singleton()  {    }
    public static Singleton getInstance()   {
        return singleton;
    }
}
// version 1.6 使用私有内部类来进行隐藏,使得只有再getInstance 函数被调用的时候,类才会被闯将,使得类的创建可控;
public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

使用上面三个版本进行创建,都可以保证线程安全;具体相关的议论,可以参考:https://coolshell.cn/articles/265.html 

保持更新;更多内容请关注cnblogs.com/xuyaowen;

原文地址:https://www.cnblogs.com/xuyaowen/p/singleton.html