《设计模式》单例模式
Posted joker D888
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《设计模式》单例模式相关的知识,希望对你有一定的参考价值。
《设计模式》单例模式
单例模式是一种常用的设计模式,其主要优点有:
- 提供了对唯一实例的全局访问。单例模式保证了整个系统中只有一个实例,这样就可以方便地对该实例进行访问和操作,避免了多个实例之间的冲突和不一致。
- 避免了重复创建实例。在某些场景下,创建某些对象的代价很高,比如需要加载大量数据或初始化一些复杂的对象,如果每次都创建新的实例,会严重影响系统性能。使用单例模式可以避免重复创建实例,提高系统的性能和效率。
- 灵活性好,易于扩展。单例模式在整个系统中只存在一个实例,这样可以方便地对该实例进行控制和管理,比如可以对该实例进行缓存、统计、记录等操作,从而提高系统的可维护性和扩展性。
单例模式适用于如下场景:
- 在整个系统中只需要存在一个实例对象的场景。比如系统中只能有一个配置对象、日志对象、数据库连接对象等。
- 需要频繁创建和销毁对象,且创建和销毁对象的代价很大的场景。比如在某些应用中需要频繁地创建和销毁数据库连接,这样会严重影响系统的性能,使用单例模式可以避免这个问题。
- 需要对某个对象进行全局访问和控制的场景。比如需要对某个资源进行统计、记录等操作,或者需要对某个对象进行缓存、预加载等操作,使用单例模式可以方便地实现这些功能。
实现单例模式有多种,下面直接介绍线程安全版的局部静态变量的懒汉模式。
简单的 C++ 单例模式的实现示例:
class Singleton
public:
static Singleton& getInstance()
//局部静态变量会在第一次调用 getInstance() 函数时被初始化,而且在初始化期间是线程安全的。因此,这个实现可以确保线程安全,而无需使用互斥锁或双重检查锁定。
static Singleton instance; // 懒汉式,使用时才创建,局部静态变量,线程安全
return instance;
private:
Singleton() // 将构造函数设为 private,避免外部直接创建对象
Singleton(const Singleton&) = delete; // 禁止拷贝构造函数
Singleton& operator=(const Singleton&) = delete; // 禁止拷贝赋值运算符
;
在这个实现中,构造函数被设为 private,这意味着外部无法直接创建 Singleton 类的对象。Singleton 类提供了一个公共的静态成员函数 getInstance(),该函数返回 Singleton 类的唯一实例。getInstance() 函数使用了懒汉式的实现方式,在第一次调用时才创建实例。
为了避免通过拷贝构造函数和拷贝赋值运算符创建多个实例,我们将这两个函数设为 deleted,这样就可以确保 Singleton 类的实例始终是唯一的。
使用单例模式可以确保某个类在运行时只有一个实例,从而避免了多个实例之间可能出现的竞态条件或冲突。单例模式在某些情况下很有用,例如全局日志对象或配置文件对象。
以上是关于《设计模式》单例模式的主要内容,如果未能解决你的问题,请参考以下文章