探索设计模式之单例模式:打造独一无二的实例

目录

 

1. 什么是单例模式?

2. 单例模式的特点

3. 单例模式的实现方式

3.1 懒汉式:

3.2 饿汉式:

3.3 选择建议

4. 单例模式的应用场景

5. 单例模式的优缺点

6. 总结


 

1. 什么是单例模式?

       单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供全局访问点。

2. 单例模式的特点

  • 独一无二的实例: 单例模式确保一个类只有一个实例对象存在,无论何时何地访问,都返回同一个实例。

  • 全局访问点: 单例模式提供一个全局的访问点,任何地方都可以通过该访问点获取单例实例。

  • 延迟实例化: 单例模式可以实现延迟实例化,即在第一次使用时才创建实例对象,节省资源。

3. 单例模式的实现方式

3.1 懒汉式:

  • 实例化时机: 在第一次使用时才进行实例化,即在 getInstance() 方法中进行实例化。
  • 线程安全性: 懒汉式的简单实现是线程不安全的,在多线程环境下可能会创建多个实例。为了解决这个问题,通常会使用同步锁来保证线程安全性,但这会带来性能损耗。

       一个学生想要去图书馆借书,但并不急着去借书,想在需要的时候再去借。这就好比懒汉式,实例对象在第一次使用时才被创建,延迟加载

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

3.2 饿汉式:

  • 实例化时机: 在类加载时就进行实例化,即直接在类定义时就创建了实例对象
  • 线程安全性: 饿汉式天生就是线程安全的,因为在类加载过程中只会执行一次实例化操作,所以不会存在多线程并发访问时创建多个实例的问题。

       一名图书管理员需要在图书馆开门之前将图书架上的书摆好,准备好迎接读者。这就好比饿汉式,实例对象在类加载时就被创建好了,提前加载

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

    private Singleton() {}

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

3.3 选择建议

  • 如果对性能要求较高,可以考虑使用饿汉式,因为它的实现简单且线程安全;
  • 如果需要延迟加载实例并且不太关心性能损耗,可以选择懒汉式,但要注意处理多线程环境下的线程安全问题,可以通过双重检查锁或者静态内部类等方式实现线程安全的懒汉式单例。

4. 单例模式的应用场景

  • 配置对象: 例如全局的配置文件对象,数据库连接池等。

  • 日志对象: 保证系统中只有一个日志实例,方便统一管理日志输出。

  • 线程池对象: 确保线程池只有一个实例,避免资源浪费。

5. 单例模式的优缺点

  • 优点: 节省系统资源、提高系统性能、方便对实例进行管理。

  • 缺点: 可能造成全局变量污染、不易扩展、可能引发线程安全问题。

6. 总结

       单例模式是设计模式中的经典之作,在实际项目中有着广泛的应用。通过合理使用单例模式,可以提高系统的性能和可维护性,同时避免了多次创建相同对象的资源浪费。🌟🚀

 

相关推荐

  1. 探索设计模式模式打造独一无二实例

    2024-04-02 15:36:03       43 阅读
  2. 【前端设计模式模式

    2024-04-02 15:36:03       60 阅读
  3. 设计模式模式

    2024-04-02 15:36:03       56 阅读
  4. C++设计模式模式

    2024-04-02 15:36:03       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 15:36:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 15:36:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 15:36:03       82 阅读
  4. Python语言-面向对象

    2024-04-02 15:36:03       91 阅读

热门阅读

  1. js判断对象是否为空的几种方法

    2024-04-02 15:36:03       40 阅读
  2. JVM基础

    JVM基础

    2024-04-02 15:36:03      42 阅读
  3. 【C/C++】C语言实现单链表

    2024-04-02 15:36:03       35 阅读
  4. Vue 中的修饰符

    2024-04-02 15:36:03       35 阅读
  5. Vue3:使用Pinia存储、读取、修改数据

    2024-04-02 15:36:03       39 阅读
  6. 算法3:查找算法

    2024-04-02 15:36:03       40 阅读
  7. 每日一题 日期统计

    2024-04-02 15:36:03       38 阅读
  8. COMP2017 9017 Assignment 2

    2024-04-02 15:36:03       32 阅读
  9. RAM IP核

    RAM IP核

    2024-04-02 15:36:03      44 阅读