23種類の設計モードC++インスタンスのメタモード
一時的なオブジェクトが多すぎることを避けるために、オブジェクトを作成し、異なるオブジェクトが必要な場合に異なるパラメータを設定します.
#include <iostream>
#include <map>
using namespace std;
/*
*
* :
*
* :
* , ,
* ,
* */
class Person {
public:
Person(string name, int age) {
m_name = name;
m_age = age;
}
virtual ~Person() {}
virtual void showInfo() = 0;
protected:
string m_name;
int m_age;
};
class Teacher: public Person {
public:
Teacher(string id, string name, int age): Person(name, age) {
m_id = id;
}
void showInfo() {
cout << "name: " << m_name << endl;
cout << "age: " << m_age << endl;
cout << "id: " << m_id << endl;
}
private:
string m_id;
};
class FlyweightFactory {
public:
FlyweightFactory() {
m_map.clear();
}
~FlyweightFactory() {
while(!m_map.empty()) {
map<string, Person*>::iterator it = m_map.begin();
Person* p = it->second;
m_map.erase(it);
delete p;
}
}
Person* getTeachar(string id) {
map<string, Person*>::iterator it = m_map.find(id);
if (it == m_map.end()) {
Teacher* tmp = new Teacher(id, "default", 0);
m_map.insert(pair<string, Person*>(id, tmp));
return tmp;
}
return it->second;
}
private:
map<string, Person*>m_map;
};
int main() {
FlyweightFactory* fac = new FlyweightFactory;
Person* p1 = fac->getTeachar("001");
p1->showInfo();
Person* p2 = fac->getTeachar("001");
p2->showInfo();
delete fac;
return 0;
}