美文网首页
创建型模式-单例模式

创建型模式-单例模式

作者: 未知角色 | 来源:发表于2019-02-11 17:43 被阅读0次

实现方式

  • 饿汉式:线程安全,调用效率高,不支持延时加载
public class Singleton {
    private static Singleton instance = new Singleton();  
    
    private Singleton(){
    }
    
    public static Singleton  getInstance(){
        return instance;
    }
}

  • 懒汉式:线程安全,调用效率较低,支持延时加载
public class Singleton {
    private static Singleton instance;  
    
    private Singleton(){
    }

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

/**
 * 懒汉式单例模式(防止反射和反序列化漏洞)
 */
public class Singleton implements Serializable {

    private static Singleton instance;  
    
    private Singleton(){ 
        // 反射漏洞
        if(instance!=null){
            throw new RuntimeException();
        }
    }
    
    public static  synchronized Singleton  getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
    
    //反序列化时,定义readResolve()则直接返回此方法指定的对象。
    private Object readResolve() throws ObjectStreamException {
        return instance;
    }
    
}
  • 静态内部类式:线程安全,调用效率高,可延时加载\color{blue}{(建议)}
public class Singleton {
    
    private static class SingletonClassInstance {
        private static final Singleton instance = new Singleton();
    }
    
    private Singleton(){
    }
    
    //方法没有同步,调用效率高!
    public static Singleton getInstance(){
        return SingletonClassInstance.instance;
    }
    
}
  • 枚举式:线程安全,调用效率高,不支持延时加载,可天然防止反射与序列化漏洞\color{blue}{(建议)}
public enum Singleton {
    //枚举元素就是单例对象!
    INSTANCE;
    
    //添加自己需要的操作!
    public void singletonOperation(){
    }
}
  • 双重检测锁:JVM底层内部模型问题,偶尔会出现问题,\color{red}{(不建议使用)}
public class Singleton{ 

  private static Singleton instance = null; 

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

相关文章

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 【设计模式】创建型设计模式汇总

    创建型设计模式汇总 1. 单例模式 1.1 单例模式的定义 一个类只允许创建一个对象或实例。 1.2 单例模式的作...

  • 23种设计模式学习总结

    创建型设计模式 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码合使用代码。 单例模式 单例模式用来...

  • 2.架构设计(单例模式设计)

    1.设计模式分为三个类 创建型 结构型 行为型 2.创建型:单例模式 为什么用单例模式?如果你看到这个问题,你怎么...

  • Python 之单例模式

    简介:单例模式(Singleton Pattern) 是最简单的设计模式之一,属于创建型的设计模式。单例模式涉及到...

  • PHP常用设计模式

    # 创建型 单例模式 工厂模式 工厂抽象模式 原型模式 建造者模式 # 结构型 # 行为型 # 3.注册模式 # ...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

  • PHP设计模式—创建型设计模式

    ** 创建型设计模式 **: 单例模式(Singleton Pattern) 工厂方法模式(Factor Patt...

  • S4. 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个...

网友评论

      本文标题:创建型模式-单例模式

      本文链接:https://www.haomeiwen.com/subject/rywqeqtx.html