设计模式之多例模式(Multition)

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;
}

猜你喜欢

转载自blog.csdn.net/w_x_myself/article/details/82115340