【设计模式】单例模式的三种实现方式

简介: 【设计模式】单例模式的三种实现方式

什么是单例模式(Singleton)?

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

这定义已经很明确了,那就是全局只能有这个类的一个实例,举世无双


这种模式使用的场景实在是太多了,它就好像对某个类实行了“计划生育”政策,限制住了某个类的数量。例如某些类对象需要经常使用,但是如果不停的构造-析构又会消耗不必要的资源;又比如某个资源或文件只能够有一个对象,那就可以通过该模式实现全局的获取。

如何实现

那么如何让全局只有一个类呢?

——需要限制类对象创建,可以将构造函数声明为private,这样就不能在外部通过new来实现了。并且利用static仅有一个全局对象的特点来限制实例个数。

问题来了,既然构造函数已经被声明为private,怎么获得该类的对象呢?

——简单,在该类的内部声明一个静态成员函数即可。可以通过这个静态成员函数来获取类内部的对象。

单例模式的实现分为懒汉、饿汉模式,主要是从是否在类初始化的时候的创建对象,如果是,那就是饿汉模式,一刻都等不及。

懒汉模式:直到需要该实例的时候才创建对应的实例,最简单的实现。

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
  //需要的时候再创建对应的实例
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

考虑到上面的代码线程不安全,可以通过加锁机制改为:

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    //采用双检查锁,避免频繁加锁,性能较好
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

注意,这里使用了两次判断,如果只使用一次判断加锁的话,在单例模式的使用过程中就会有很多次加锁操作。而这些加锁操作是可以避免的,这种方式被称为double-check。

**饿汉模式:类初始化的时候就建立该类的一个实例,**通过静态变量来实现。

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //可以通过该API获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}

总结

总之,单例模式的核心就是**保证类对象只有一个。**而具体的实现方式则是为了应对不同场景、性能要求而选择的。

参考资料

《大话设计模式》

相关文章
|
4月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
159 15
|
11月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
83 2
|
5月前
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
105 0
|
6月前
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
7月前
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
110 4
|
9月前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
337 13
|
9月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
103 2
|
10月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
135 4
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
10月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
106 1