重学设计模式之单例模式

发布于: 22 小时前
重学设计模式之单例模式

单例模式(Singleton)

单例模式(Singleton Pattern)顾名思义就是该类有且只有一个实例,并且对外提供可以访问该实例的方法,在23中设计模式中属于创建型模式,它提供了一种创建对象的最佳方式。

严格来说有7种写法,有2种是完美的写法,一般不用

  • 特点

  • 只有一个实例

  • 一般拥有私有的构造方法和静态实例

  • 实现方法:

  • 饿汉模式:静态常量对象实例,对外提供访问该实例的方法(简单,有效,无线程安全问题)

  • 懒汉模式:

  • 静态对象实例,对外提供访问该实例的方法,判断实例是否初始化,没有初始化时进行初始化(多线程访问时,刚开始可能会产生多个实例)

  • 静态对象实例,使用synchronized修饰访问方法(多线程访问时会有效率问题)

  • 静态对象实例,使用synchronized对判断语句枷锁(同上)

  • 静态对象实例(没有问题)

  • 这里对实例变量要加上volatile,因为执行的时候会有一个语句重排,尤其是用JIT时,它会在没有语句重排的时候就返回INSTANCE

private static volatile Singleton INSTANCE = null;
public static Singleton getInstance(){
if(INSTANCE == null){
synchronized(Singleton.class){
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}

  • 静态内部类方式实现(完美写法之一)

 public class Singleton{
private Singleton(){
}
private static class SingletonHolder{
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}

  • 使用枚举方式实现(完美写法之二)

该写法还可以防止反序列化,原因是枚举类没有构造方法,枚举是个abstract class

 public enum Singleton{
INSTANCE;
}

用户头像

王友

关注

还未添加个人签名 2018.03.26 加入

还未添加个人简介

评论

发布
暂无评论
重学设计模式之单例模式