[设计模式] 单例模式

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。[设计模式] 单例模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概述

设计模式—- 单例模式

  • 这是一个创建型的设计模式

  • 它保证某一个类只会有一个实例,实际用途就是比如说我要写一个全局的配置类,或者数据库操作类,全局可能都会访问到,但是需要保证信息同步。

  • 而在使用这种设计模式之前,我的解决方案就是通过继承的方式解决,或者大量的全局静态变量,尤其是后者,实际上并不太好用。

原理

  • 通过将构造函数设置为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,即使这是一个“新的对象”(实际上还是原来那个)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/225581.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!