2.单例模式

一、定义

确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。

二、要解决的问题

  • 独生子女
    无论new了多少个对象,始终只存在一个实例
  • 应用场景
    对临界资源(例如日志、打印机)的访问

三、解决步骤

  1. 将构造函数声明成私有类型
  2. 声明一个类的静态实例
  3. 提供一个获得实例的方法

四、代码实现

4.1 实现方法1

下面这种方式存在以下问题

  • 只提供了getInstance方法获取对象,没有提供释放函数
  • 析构函数不会被运行
  • 多线程调用getInstance时将不是线程安全的
cpp 复制代码
class Singleton
{
private:
	static Singleton* singleton;  //实例对象为私有

	Singleton()  //构造方法为私有
	{
		std::cout << "Singleton" << std::endl;
	}
	
	~Singleton()
	{
		std::cout << "~Singleton" << std::endl;
	}

public:
	static Singleton& getInstance()
	{
		if (!singleton)
		{
			singleton = new Singleton();
		}

		return *singleton;
	}

	void printAddress()
	{
		printf("%p\n", this);
	}
};

Singleton* Singleton::singleton = nullptr;

4.2 实现方法2

改进点

  • 禁止单例模式的拷贝和赋值
  • 采用局部静态变量的方式返回,线程安全(c++11及以后)
  • 没有采用new关键字在堆空间中申请内存,空间被自动管理
  • 析构函数被自动执行
cpp 复制代码
class Singleton
{
private:
	Singleton()  //构造方法为私有
	{
		std::cout << "Singleton" << std::endl;
	}
	~Singleton()
	{
		std::cout << "~Singleton" << std::endl;
	}

	//禁止拷贝和赋值
	Singleton(const Singleton& obj) = delete;
	Singleton& operator=(const Singleton& obj) = delete;


public:
	static Singleton& getIntance()
	{
		static Singleton instance;

		return instance;
	}

	void printAddress()
	{
		printf("%p\n", this);
	}
};

int main()
{
	Singleton::getIntance().printAddress();
	Singleton::getIntance().printAddress();
}
相关推荐
七月丶1 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞1 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟2 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder2 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室2 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦3 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo6 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4966 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃6 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式