栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 单例模式智能指针实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 单例模式智能指针实现

在前端或者后台开发过程中,或多或少都要有一些全局变量,或者某个关键数据不允许重复构造,这个时候单例模式在C++程序中是一个不错的选择。
本代码示例结合智能指针做了一个单例模式。

class IwmGlobal : private std::enable_shared_from_this
{
public:
	IwmGlobal(const IwmGlobal &) = delete;
	IwmGlobal &operator=(const IwmGlobal &) = delete;

	static std::shared_ptr &instance() {
		if (nullptr != s_instance)
		{
			return s_instance;
		}

		Mutex::Locker lock(s_mutex);
		if (nullptr != s_instance)
		{
			return s_instance;
		}
		s_instance = shared_ptr(new IwmGlobal());
		return s_instance;
	}
private:
	static std::shared_ptr  s_instance;
	IwmGlobal() { m_bInit = FALSE; }
	static Mutex s_mutex;

private:
	BOOL m_bInit;

public:
	//所有配置文件相关信息
	std::shared_ptr  appCfg;
	IchsPool      taskManMsgQueue;
	IchsPool      robotCtrlQueue;
	std::shared_ptr     mqHandle;

	string listener_topic;
};
typedef std::shared_ptr IwmGlobalPtr;

说明:
1、将构造函数声明为 private

 private:
	static std::shared_ptr  s_instance;
	IwmGlobal() { m_bInit = FALSE; }

2、将C++类的默认实现的类重载函数去掉

    IwmGlobal(const IwmGlobal &) = delete;
	IwmGlobal &operator=(const IwmGlobal &) = delete;

3、初始化实例

static std::shared_ptr &instance() {
		if (nullptr != s_instance)
		{
			return s_instance;
		}

		Mutex::Locker lock(s_mutex);
		if (nullptr != s_instance)
		{
			return s_instance;
		}
		s_instance = shared_ptr(new IwmGlobal());
		return s_instance;
	}

因为单例模式无法直接调用make_shared()进行实例化,原因是构造函数为private,无法被外部调用,所以折中的方式是:

s_instance = shared_ptr(new IwmGlobal());

注意:
因为是单例模式,相当于全局变量的存在,在程序加载过程中可能会存在instance多线程同时加载的情况, 为了避免该懒加载模式出现问题,最好加一个资源锁。
另外,单例模式设计过程需要明确区分,句柄初始化和数据加载初始化。
1、句柄初始化
句柄初始化为类或者结构体初始化,
2、数据加载初始化
而数据加载初始化是为了服务正常工作,需要加载配置数据或者连接初始化(如服务配置、tcp连接、服务初始化、db数据库连接初始化、MQ连接初始化、redis连接初始化)

个人理解,单例模式适合做句柄初始化,从程序架构上来看,最好将逻辑分开,一则污染了单例模式的设计本意,二则代码逻辑上对单例模式也是承重的负担。数据加载初始化建议采用工厂模式解耦处理。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935904.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号