重学设计模式之单例模式

用户头像
王友
关注
发布于: 2020 年 06 月 21 日
重学设计模式之单例模式

单例模式(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 加入

间歇性自律,持续性懒散,真的很懒!

评论

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