1、定义
和单例基本一样,是有个数限制的单例。如果对于产生的实例个数没有限制,那就不是多例了,和普通的类没有区别。
2、源码
2.1、头文件
Emperor.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class Emperor
{
private:
string info;
static int maxNumOfEmperor;
static vector<Emperor*> emperor_list;
Emperor();
Emperor(string info);
~Emperor();
public:
static Emperor* getInstance(int idx);
void emperorInfo();
static void releaseInstance();
};
2.2、实现
Emperor.cpp
#include "Emperor.h"
int Emperor::maxNumOfEmperor = 3;
vector<Emperor*> Emperor::emperor_list;
Emperor::Emperor(void)
{
cout << "create emperor instance" << endl;
}
Emperor::Emperor(string info)
{
cout << "create emperor instance with info " << endl;
this->info = info;
}
Emperor::~Emperor(void)
{
cout << "destroy emperor instance and release its resources" << endl;
}
void Emperor::emperorInfo()
{
char msg_buf[50] = {0};
sprintf_s(msg_buf, 50, "the emperor's name is (%s)", this->info.c_str());
string msg(msg_buf);
cout << msg.c_str() << endl;
}
Emperor *Emperor::getInstance(int idx)
{
if(emperor_list.empty())
{
for(int i = 0; i < maxNumOfEmperor; ++ i)
{
char name[10] = {0};
sprintf_s(name, 10, "emperor %d", i);
string tmp(name);
Emperor *emp = new Emperor(tmp);
emperor_list.push_back(emp);
}
}
if(idx > -1 && idx < maxNumOfEmperor)
return emperor_list.at(idx);
return NULL;
}
void Emperor::releaseInstance()
{
emperor_list.clear();
}
main.cpp
#include "Emperor.h"
int _tmain(int argc, _TCHAR* argv[])
{
Emperor *emperor1 = Emperor::getInstance(0);
emperor1->emperorInfo();
Emperor *emperor2 = Emperor::getInstance(1);
emperor2->emperorInfo();
Emperor *emperor3 = Emperor::getInstance(2);
emperor3->emperorInfo();
system("pause");
return 0;
}