二十三种设计模式:单例模式

简介: 在这个代码中,我们定义了一个名为Singleton的类,其中包含一个私有的静态指针instance,用于存储单例对象的唯一实例。构造函数被私有化,这意味着外部无法直接实例化Singleton类的对象。我们通过getInstance()方法来获取Singleton类的唯一实例,如果instance指针为空,则创建一个新的Singleton对象并将其赋值给instance指针。最后,我们定义了一个doSomething()方法,用于执行单例类的具体操作。

单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式可以避免多个实例造成的资源浪费和冲突问题,同时也方便了对实例的管理和控制。


在C++中,可以通过以下方式实现单例模式:


静态成员变量:将类的实例作为静态成员变量,通过静态成员函数获取实例。静态成员变量只会被初始化一次,保证了只有一个实例。


懒汉式:在第一次使用时创建实例,通过静态成员函数获取实例。需要注意线程安全问题,可以通过加锁等方式解决。


饿汉式:在程序启动时创建实例,通过静态成员函数获取实例。需要注意实例的初始化顺序问题,可以通过静态初始化解决。


Meyers’ Singleton:利用静态局部变量的特性,在第一次使用时创建实例。该方式可以避免线程安全问题和实例初始化顺序问题,但需要注意静态局部变量的线程安全问题。


以上是常用的单例模式实现方式,需要根据具体情况选择合适的方式。同时,还需要注意单例模式的使用场景和限制,避免滥用和误用。


C++实现单例模式

以下是一个简单的单例模式的C++代码:


class Singleton {
private:
    static Singleton* instance;
    Singleton() {} // 构造函数私有化,防止外部实例化
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    void doSomething() {
        // 单例类的具体操作
    }
};
Singleton* Singleton::instance = nullptr;


在这个代码中,我们定义了一个名为Singleton的类,其中包含一个私有的静态指针instance,用于存储单例对象的唯一实例。构造函数被私有化,这意味着外部无法直接实例化Singleton类的对象。我们通过getInstance()方法来获取Singleton类的唯一实例,如果instance指针为空,则创建一个新的Singleton对象并将其赋值给instance指针。最后,我们定义了一个doSomething()方法,用于执行单例类的具体操作。


需要注意的是,这个代码只是一个简单的示例,实际上单例模式的实现可能会更加复杂,需要根据具体的需求进行调整。


Rust 实现单例模式

以下是一个注释丰富的Rust单例模式代码:

use std::sync::{Mutex, Once};
// 使用lazy_static宏来实现单例模式
lazy_static! {
    // 定义一个名为SINGLETON的Mutex<Singleton>对象,用于存储单例对象的唯一实例
    static ref SINGLETON: Mutex<Singleton> = Mutex::new(Singleton::new());
}
// 定义一个名为Singleton的结构体,用于存储单例类的具体属性和操作
struct Singleton {
    // 单例类的具体属性
}
impl Singleton {
    // 定义一个名为new的函数,用于创建Singleton类的唯一实例
    fn new() -> Self {
        // 单例类的具体初始化操作
        Self {
            // 初始化属性
        }
    }
    // 定义一个名为do_something的函数,用于执行单例类的具体操作
    fn do_something(&self) {
        // 单例类的具体操作
    }
}
// 定义一个名为get_singleton的函数,用于获取Singleton类的唯一实例
pub fn get_singleton() -> &'static Mutex<Singleton> {
    // 返回一个静态的Mutex<Singleton>引用,这样我们就可以在程序的任何地方获取Singleton类的唯一实例
    &SINGLETON
}


在这个代码中,我们使用注释来解释每个部分的作用和功能。我们使用lazy_static宏来实现单例模式,定义了一个名为SINGLETON的Mutex对象,用于存储单例对象的唯一实例。我们定义了一个名为Singleton的结构体,用于存储单例类的具体属性和操作。在get_singleton()函数中,我们返回了一个静态的Mutex引用,这样我们就可以在程序的任何地方获取Singleton类的唯一实例。


需要注意的是,Rust的单例模式实现与C++的实现略有不同,这是因为Rust的所有权和生命周期机制与C++不同。但是,这个代码仍然可以实现单例模式的基本功能。

目录
相关文章
|
4月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
158 15
|
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) - 改良设计模式 - 单例模式
102 2
|
10月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
135 4
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
10月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
72 0