首页 > 其他分享 >设计模式——单例模式

设计模式——单例模式

时间:2022-10-29 23:22:05浏览次数:92  
标签:Singleton 模式 class instance static private 单例 设计模式 public

懒汉式

public class Singleton {
  private static Singleton instance;

  private Singleton() {
  }

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

优点:只有在使用时才会实例化单例,一定程度上节约了内存资源。

缺点:第一次加载时要立即实例化,反应稍慢。每次调用getInstance()方法都会进行同步,这样会消耗不必要的资源这种模式一般不建议使用

饿汉式

public class Singleton {
  private static Singleton instance = new Singleton();

  private Singleton() {
  }

  public static Singleton getInstance() {
    return instance;
  }
}

优点:线程安全,不需要考虑并发安全性。

缺点:浪费内存空间,不管该对象是否被使用到,都会在启动是提前分配内存空间.

DCL双重检测锁

public class Singleton {
  private static volatile Singleton instance = null;

  private Singleton() {
  }

  public static Singleton getInstance() {
    // 两层判空,第一层是为了避免不必要的同步
    if (instance == null) {
      synchronized (Singleton.class) {
        if (instance == null) {// 第二层是为了在null的情况下创建实例
          instance = new Singleton();
        }
      }

    }
    return instance;
  }
}

优点:资源利用率高,既能够在需要的时候才初始化实例,又能保证线程安全,同时调用getInstance()方法不进行同步锁,效率高。

缺点:第一次加载时稍慢,由于Java内存模型的原因偶尔会失败。在高并发环境下也有一定的缺陷,虽然发生概率很小。

静态内部类

public class Singleton {
  private Singleton() {
  }

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

  /**
    * 静态内部类
    */
  private static class SingletonHolder {
    private static Singleton instance = new Singleton();
  }
}

优点:

  • 对象的创建是线程安全的。
  • 支持延时加载。
  • 获取对象时不需要加锁

基于枚举实现

public class Singleton {
  private Singleton(){
  }

  public static enum SingletonEnum {
    SINGLETON;
    
    private Singleton instance = null;
    
    private SingletonEnum(){
      instance = new Singleton();
    }
    
    public Singleton getInstance(){
      return instance;
    }
  }
}

基于容器实现

public class SingletonManager {
  private static Map<String, Object> objMap = new HashMap<String, Object>();

  public static void regsiterService(String key, Object instance) {
    if (!objMap.containsKey(key)) {
      objMap.put(key, instance);
    }
  }

  public static Object getService(String key) {
    return objMap.get(key);
  }
}

SingletonManager可以管理多个单例类型,在程序的初始化时,将多个单例类型注入到一个统一管理的类中,使用时根据key获取对象对应类型的对象。这种方式可以通过统一的接口获取操作,隐藏了具体实现,降低了耦合度。


欢迎小伙伴们积极指正和讨论,一起共同成长。

标签:Singleton,模式,class,instance,static,private,单例,设计模式,public
From: https://www.cnblogs.com/back-garden/p/16840197.html

相关文章

  • Hadoop之HDFS的集群之间的数据复制、归档机制和安全模式
    (HDFS的数据数据复制、归档机制和安全模式)1.不同集群之间的数据复制在我们实际工作当中,极有可能会遇到将测试集群的数据拷贝到生产环境集群,或者将生产环境集群的数据拷......
  • 中介者模式
    [实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:1.新的具体聊天室中发送的图片大小不得超过20M。2.新的具体聊......
  • 【设计模式】建造者模式
    建造者模式的意图建造者模式又被称呼为生成器模式,属于创建型模式。(使用多个简单对象一步一步构建成一个复杂的对象,这样像一间房子从地基到建造完成,这就是为啥被称呼为叫做......
  • 抽象工厂模式
    概述《设计模式》中对抽象工厂(AbstractFactory)模式的意图描述如下:提供一个接口以创建一系列相关或相互依赖的对象,而无需指定它们具体的类一般抽象工厂中的类结构如......
  • 【JS ES6】use strict 严格模式
    目录​​什么是严格模式​​​​启用严格模式​​​​严格模式中的变化​​由于JavaScript语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用var关键字来提......
  • JQueue一个实现Outbox模式的库
       为了提高系统吞吐率,也就是提高生产效率,核心观点如下,系统设计也是如此    在微服务或任何其他基于事件的架构(event-driven-architecture)中,在一些用例中,一个......
  • 状态模式
    一、前言自然界所有事物都有自己的存在状态,比如水有固态、液态、气态,三种不同的心态有着完全不一样的外在特性,我们将事物所处的某一种形态称为状态。二、状态模式概念状态模......
  • 设计模式之装饰模式
    概述装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。在现实生活中,这种情况也到处存在,例如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有......
  • 【Vue2.0学习】—路由的两种工作模式(六十六)
    【Vue2.0学习】—路由的两种工作模式(六十六)对于一个url来说,什么是hash值?#以及后面的内容就是hash值hash值不会包含在HTTP请求中,即:hash值不会带给服务器hash模式:地址中永远带......
  • 设计模式九(命令模式、解释器模式、迭代器模式、中介者模式)
    命令模式(CommandPattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传......