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