生成多个全局对象(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出来的多例模式对象