设计模式——单例模式

一、单例模式

单例模式是什么?

单例模式是一种创建型的软件设计模式,在工程项目中十分常见。通过单例模式的设计,使得创建的类在当前进程中只有一个实例,并提供一个全局性的访问点,这样可以规避因频繁创建对象而导致的内存飙升情况。

应用场景

有些对象控制大量的共享资源(如数据库或者文件)的访问权限,如果同时存在大量对象进行访问,可能会造成混乱引起安全问题,有些对象本身占用大量的资源,存在过多实例会造成资源的浪费,如果应用中某个类对于所有使用者而言只有一个可用的实例则可使用单例模式。

实现单例模式的关键

  • 私有化构造函数:由于外部无法调用类的私有成员,因此可以阻止用户创建多个实例
  • 移除拷贝构造函数和赋值构造函数
  • 静态私有成员变量:该变量指向生成的唯一实例
  • 公有的静态成员函数:提供外部访问唯一实例的接口

单例模式类型

按唯一实例创建的时机可分为懒汉式和饿汉式两种单例模式

  • 懒汉式: 在需要使用该实例时才去真正的创建该实例,由于是非必要不创建,因此被称为懒汉式。
  • 饿汉式: 在类装载时就进行了实例的创建,就算后面全程没用使用也会创建该实例,有种不管三七二十一先创建再说的意味,因此称之为饿汉式。

实现一个单例类Singleton

基础版本:

私有构造函数:

cpp 复制代码
Private:
Single(){
	std::cout << "调用构造函数" << std::endl
}
~Single(){
	std::cout << "调用析构函数" << std::endl
}

移除拷贝构造函数和赋值构造函数

cpp 复制代码
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

静态私有成员变量指向唯一实例

cpp 复制代码
Static Singleton* instance_;

提供外部访问唯一实例的接口

懒汉式实现方式

基础版本:

cpp 复制代码
static Singleton* GetInstance(){
	if ( instance_ == nullptr){
		instance_ = new Singleton();
	}
	return instance_;
}

当在多线程模式下多个线程同时调用Singleton::GetInstance()时可能会创建多个实例而导致内存泄漏,简单的处理方式是通过互斥锁实现线程安全

cpp 复制代码
static Singleton* GetInstance(){
	if ( instance_ == nullptr){
		m_mutex_.lock();
		if ( instance_ == nullptr){
			instance_ = new Singleton();
		}
		m_mutex_.unlock();
	}
	return instance_;
}
Static std::mutex m_mutex_;

饿汉式实现方式

cpp 复制代码
static Singleton* GetInstance(){
	return instance_;
}
全局变量区
Singleton* Singleton::instance_ = new Singleton();

Meyers' Singleton

cpp 复制代码
static Singleton* GetInstance(){
	static Singleton instance;
	return instance;
}

优点:

● 解决了普通单例模式全局变量初始化依赖(C++只能保证在同一个文件中声明的static遍历初始化顺序和其遍历声明的顺序一致,但是不能保证不同文件中static遍历的初始化顺序)

缺点:

● 需要C11支持(C11保证static成员初始化的线程安全)

● 性能问题(同懒汉模式一样,每次调用GetInstance()方法时需要判断局部static变量是否已经初始化,如果没有初始化就会进行初始化,这个判断逻辑会消耗一点性能)

相关推荐
艾利克斯冰6 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
星心源七境10 小时前
七境体系全解析:从六韬兵法到AI锁颜,一套贯穿古典智慧与现代应用的成长操作系统
人工智能·设计模式·设计
qq_2975746712 小时前
设计模式系列文章(基础篇第21篇):迭代器模式——遍历聚合解耦,实现统一迭代访问
设计模式·迭代器模式
仙俊红14 小时前
Java 单例模式:类里面为什么可以有自己类型的字段?
java·开发语言·单例模式
禅思院14 小时前
前端请求取消与调度完全指南:从 AbortController 到企业级优先级架构
前端·设计模式·前端框架
小bo波14 小时前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
写代码的小阿帆15 小时前
行为型设计模式之观察者(发布-订阅)模式
设计模式
王_teacher16 小时前
23种设计模式全解析(GoF 设计模式)
设计模式·软考·软件设计师·软考中级
阿坤带你走近大数据17 小时前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
geovindu17 小时前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式