Factory Method パターン

Factory Method パターン - Wikipedia

インスタンスを生成する工場をTemplate Method パターンで構成したもの。

Factory(Creator)でProduct(Product)の生成手順を記述しておいて、IDCardFactory(Concrete Creator)にIDCard(Concrete Productの作り方の詳細を記述。

#include <string>
#include <iostream>
#include <vector>
using namespace std;
//Product
class Product
{
public :
	virtual void Use() const = 0;
};
//Creator
class Factory
{
public :
	Product * Create(string owner){
		Product * product = CreateProduct(owner);
		RegisterProduct(*product);
		return product;
	}
protected :
	virtual Product * CreateProduct(string owner) = 0;
	virtual void RegisterProduct(const Product & product) = 0;
};
//Concrete Product
class IDCard : public Product
{
public :
	IDCard(string owner){
		cout << owner << "のカードを作ります。" << endl;
		this->owner_ = owner;
	}
	void Use() const{
		cout << this->owner_ << "のカードを使います。" << endl;
	}
	string GetOwner() const{
		return this->owner_;
	}
private :
	string owner_;
};
//Concrete Creator
class IDCardFactory : public Factory
{
protected :
	Product * CreateProduct(string owner){
		return new IDCard(owner);
	}
	void RegisterProduct(const Product & product){
		const IDCard & p = dynamic_cast<const IDCard &>(product);
		owners_.push_back(p.GetOwner());
		
	}
private :
	vector<string> owners_;
};

//main 
int main()
{
	Factory *factory = new IDCardFactory();
	Product * p1 = factory->Create("teramonagi");
	Product * p2 = factory->Create("gigamonagi");
	p1->Use();
	p2->Use();
	delete p1, p2;
	delete factory;
	getchar();
	return 0;
}