C++设计模式之多例模式(2)

生成多个全局对象(Singletons)

单例模式扩展成只生成多个全局对象,比如集群、一台机器再高级也扛不住很多人的访问,所以可以由多台计算机组成一个集群进行访问,所以有时间需要这个集群的需要,所以就可以扩展成多例模式

延迟加载模式(懒汉模式)

一旦电脑上了集群的时候,节省计算机资源只能是延迟加载模式

多例模式的设计

先设计一个最大的实例个数为5,当申请实例大于这个数的时候返回第一个申请的实例!

//缓存最大的实例个数
const static int NUM_MAX = 5;

这个用于当前的实例个数与实例对象MoreSingletonEx进行绑定

class MoreSingletonEx;      //定义这个类的头部声明,定义完成之后map的泛型才能找到这个声明
map<int, MoreSingletonEx*> map_single = map<int, MoreSingletonEx*>();

建立一个多例模式的类其中MoreSingletonEx构造函数中设置为私有,意思就是不允许私自new出一个多例模式的对象,getInstance方法中,先用当前的实例索引m_instanceCout取出一个多例模式对象指针,如果这个多例模式对象指针为空,则new出一个对象存放到m_single 中,然后当前实例索引递增,如果当前实例索引大于最大实例数,把当前实例索引置成1,此时1号索引对应的map已经new出了多例模式对象并且绑定了,此时就可以直接用1作为键取出键值、这个键值就是多例模式对象(从头开始取),一直到最大实例数,接着又重头开始,彼此循环!

class MoreSingletonEx
{
private:
	MoreSingletonEx()
	{
		m_single = nullptr;
		cout << "正在构建MoreSingletonEx" << endl;
	}

public:

	static MoreSingletonEx* getInstance()
	{
		m_single = map_single[m_instanceCout];

		if (m_single == nullptr)
		{
			m_single = new MoreSingletonEx;
			map_single[m_instanceCout] = m_single;
		}
		m_instanceCout++;

		if (m_instanceCout > NUM_MAX)
		{
			//如果大于最大实例数的话,把m_instanceCout成1,从1开始拿
			m_instanceCout = 1;
		}
		return m_single;
	}

private:
	static MoreSingletonEx* m_single;
	static int m_instanceCout;
};
m_single的初始值为空,表示懒汉模式(延迟加载模式)
MoreSingletonEx* MoreSingletonEx::m_single = nullptr;
int MoreSingletonEx::m_instanceCout = 1;//初始化的实例个数

m_single的初始值为空,表示懒汉模式(延迟加载模式)

MoreSingletonEx* MoreSingletonEx::m_single = nullptr;
int MoreSingletonEx::m_instanceCout = 1;//初始化的实例个数

测试多例模式

auto p1 =  MoreSingletonEx::getInstance();
	auto p2 =  MoreSingletonEx::getInstance();
	auto p3 =  MoreSingletonEx::getInstance();
	auto p4 =  MoreSingletonEx::getInstance();
	auto p5 =  MoreSingletonEx::getInstance();

此时连续获取5次多例模式对象的实例,会发现5次都是不同的值,因为最大的实例数就是5次

//最多只会构建5次
	str << 
		"p1=" << hex << p1 <<
		",p2=" << hex << p2 <<
		",p3=" << hex << p3 <<
		",p4=" << hex << p4 <<
		",p5=" << hex << p5;
cout << string(str.str()) << endl;

最终输出结果

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

p1=013D5A10,p2=013D5CC8,p3=013DCC38,p4=013DCE30,p5=013D5AF0

如果超过5次获取

//多例模式
	auto p1 =  MoreSingletonEx::getInstance();
	auto p2 =  MoreSingletonEx::getInstance();
	auto p3 =  MoreSingletonEx::getInstance();
	auto p4 =  MoreSingletonEx::getInstance();
	auto p5 =  MoreSingletonEx::getInstance();
	//最多只会构建5次
	str << 
		"p1=" << hex << p1 <<
		",p2=" << hex << p2 <<
		",p3=" << hex << p3 <<
		",p4=" << hex << p4 <<
		",p5=" << hex << p5;
	


	cout << string(str.str()) << endl;

	auto p6 = MoreSingletonEx::getInstance();
	auto p7 = MoreSingletonEx::getInstance();
	auto p8 = MoreSingletonEx::getInstance();
	auto p9 = MoreSingletonEx::getInstance();
	auto p10 = MoreSingletonEx::getInstance();
	//到达第十一次会从头开始
	auto p11 = MoreSingletonEx::getInstance();

	// 


	str.str("");
	str << "p6=" << hex << p6 <<
		",p7=" << hex << p7 <<
		",p8=" << hex << p8 <<
		",p9=" << hex << p9 <<
		",p10=" << hex << p10 <<
		",p11=" << hex << p11;

	cout << string(str.str()) << endl;

最终输出结果

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

正在构建MoreSingletonEx

p1=01515CD0,p2=015159B0,p3=015159E0,p4=01515A10,p5=01515AF0

p6=01515CD0,p7=015159B0,p8=015159E0,p9=01515A10,p10=01515AF0,p11=01515CD0        

此时p6的值与p1相等!

总结

1 多例模式的设计可以体现在计算机集群

2 多例模式比单例模式更具有扩展性

3 多例模式的获取实例对象就是不断重复获取之前new出来的多例模式对象

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个卖卡的小男孩~小曾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值