のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

DesignPattern Prototype(大量にコピーしよう)

Sponsored Links

皆さんこんにちは
お元気ですか。私は

本日はDesign PatternのPrototypeについて記載します。

Prototypeとは?

動作

一つインスタンスを生成するとそれらをコピーして複製を行うことをプロトタイプパターンといいます。
clone()メソッドで新しいオブジェクトを生成してます。

利点

・複雑な動作を行った後に複製を行おうとすると正直、コードが煩雑になる。それらを防ぐ役割を持つ。
・複製するのが簡単になる。一つ作ればコピーするだけで済む

→要はコピーが肝なのですね。

クラス図

f:id:tereka:20140620080736p:plain

継承したプロトタイプを作成、それをmainから操作しています。
(実際にやる場合は別途クラス作って、それを操作する形になるでしょう)

実際のコード

#include <iostream>

using namespace std;

class PizzaPrototype{
protected:
	int cheese;
public:
	virtual void setCheese(int x) = 0;
	virtual int getCheese() = 0;
};

class SpicyPizza:public PizzaPrototype{
public:
	virtual void setCheese(int x){
		cheese = x;
	}

	SpicyPizza* clone(){
		return new SpicyPizza(*this); 
	}

	int getCheese(){
		return cheese;
	}
};

class MeatPizza:public PizzaPrototype{
public:
	virtual void setCheese(int x){
		cheese = x;
	}

	MeatPizza* clone(){
		return new MeatPizza(*this);
	}

	int getCheese(){
		return cheese;
	}
};

int main(int argc, char const *argv[]){
	SpicyPizza *s_pizza1 = new SpicyPizza;
	s_pizza1->setCheese(100);
	cout << "SpicyPizza1 " << s_pizza1->getCheese() << endl;

	SpicyPizza *s_pizza2 = s_pizza1->clone();
	cout << "SpicyPizza2 " << s_pizza1->getCheese() << endl;

	MeatPizza *m_pizza1 = new MeatPizza;
	m_pizza1->setCheese(20);
	cout << "MeatPizza1 " << m_pizza1->getCheese() << endl;

	MeatPizza *m_pizza2 = m_pizza1->clone();
	cout << "MeatPizza2 " << m_pizza1->getCheese() << endl;
	return 0;
}

PizzaPrototypeを継承したMeatPizzaクラスとSpicyPizzaクラスからオブジェクト作ってコピーした時の動作を確認しています。
各クラスのclone()で自分自身のコピーを返すようにしています。