[设计模式] 单例模式
概述
设计模式---- 单例模式
这是一个创建型的设计模式
它保证某一个类只会有一个实例,实际用途就是比如说我要写一个全局的配置类,或者数据库操作类,全局可能都会访问到,但是需要保证信息同步。
而在使用这种设计模式之前,我的解决方案就是通过继承的方式解决,或者大量的全局静态变量,尤其是后者,实际上并不太好用。
原理
- 通过将构造函数设置为
private
的方式,使得不能通过new创建实例 - 创建实例则是通过创建一个公开的函数获取实例,并且保存到类中的一个静态变量当中
- 如果已经实例化一次,则直接返回实例化的对象
- 如果是第一个实例化,则使用new创建对象,并且保存对象指针到静态变量中
详解:https://refactoringguru.cn/design-patterns/singleton
Show Code
#include <iostream>
using namespace std;
// singleton
class singleton
{
private:
singleton();
~singleton();
static singleton* instance; // 对象指针是静态的
int var1 = 10;
public:
static singleton* getInstance(); // 获取对象的函数也是静态的
int var(); // 获取器
void var(int); // 重载_设置器
};
singleton *singleton::instance = nullptr; // 类中的静态变量一定要初始化
singleton::~singleton() // 析构函数实现
{
}
singleton::singleton() // 构造函数也一定要实现
{
}
singleton* singleton::getInstance() // 实现部分不需要静态关键字static
{
if (instance == NULL)
{
instance = new singleton();
return instance;
}
return instance;
}
int singleton::var()
{
return var1;
}
void singleton::var(int v)
{
var1 = v;
}
int main()
{
singleton* ins= singleton::getInstance();
ins->var(15);
singleton* ins2 = singleton::getInstance();
cout << ins2->var() << endl; // 输出是15而不是10
return 0;
}
我总是忘记初始化类中的静态变量,这会导致vs出现无法解析的符号错误
LNK2019 无法解析的外部符号 "private: __thiscall singleton::singleton(void)" (??0singleton@@AAE@XZ),该符号在函数 "public: static class singleton * __cdecl singleton::getInstance(void)" (?getInstance@singleton@@SAPAV1@XZ) 中被引用
最终,运行的结果是15而不是10,即使这是一个“新的对象”(实际上还是原来那个)
作者:cjdty
出处:https://www.cnblogs.com/cjdty/p/12900896.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库