设计模式-单例模式


单例模式的定义

单例模式: 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例

三个要点:

  • 该类只有一个实例
  • 可以自动实例化
  • 必须向整个系统提供这个实例

单例模式的实现

1.饿汉式(Eager Singleton)

类被加载时,就创建对象的引用并实例化,当外部需要对象时获取该对象

public class Singleton{
    private Singleton(){}    //私有化构造函数(外部无法创建对象)
    private static Singleton instance = new Singleton();    //创建对象的引用并实例化
    public static Singleton getInstance(){    //提供一个公共的静态方法供外部获取创建的对象
        return instance;
    }
}

2.懒汉模式(Lazy Singleton)

先创建对象的引用但不实例化,在对象被第一次引用时实例化对象

需要考虑线程安全问题

public class Singleton{
    private Singleton(){}    //私有化构造函数
    private static volatile Singleton instance;        //创建对象的引用但不实例化
    public static Singleton getInstance(){    //外部获取对象的方法
        if(instance == null){    //外层多一次判断,当对象存在时,不需要经过同步锁,提高速度
            synchronized(Singleton.class){        //加锁解决线程安全问题
                if(instance == null){
                    instance = new Singleton();    //对象第一次被引用,实例化对象
                }
            }
        }
    }
}

3.Holder模式(推荐)

public final class Singleton {
    private Singleton() {}

    //被调用时才会装载,从而实现延迟加载
    private static class SingletonHolder{
        //静态初始化器,由JVM保证线程安全
        private static final Singleton single = new Singleton();
    }

    public static Singleton getInstance(){ return SingletonHolder.single; }
}

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
设计模式-模版设计模式 设计模式-模版设计模式
模版设计模式的定义 定义一个操作中的算法的框架,而将一些步骤放到子类中,是的子类可以不改变该算法框架即可重定义该算法的某些特定步骤 简单实例: 计算程序运行时间的模版 注意: 一般模版方法都会加上final关键字,不允许被重写 abst
2018-05-19
下一篇 
  目录