BASIC OOP ~Vol.6~

BASIC OOP ~Vol.6~

Prototype

概要

  • サブクラスを意識せずサブクラスを複製する

解説

まず、形状を表現するスーパークラスを定義します。

//	形状スーパークラス
class IShape
{
protected:
	IShape() = default;
public:
	virtual ~IShape() = default;
public:
	virtual void Draw() = 0;
public:
	//	複製を生成
	virtual IShape* Clone() = 0;
};

続いて点と線を表現するサブクラスをそれぞれ定義しました。

//	形状サブクラス:点
class CPoint final : public IShape
{
public:
	CPoint() = default;
	CPoint(float x, float y) : m_fX(x), m_fY(y) {}
public:
	virtual void Draw()
	{
		std::cout << "Point:" << "(" 
			<< m_fX << "," 
			<< m_fY << ")" << std::endl;
	}
public:
	//	複製を生成
	virtual IShape* Clone()
	{
		return new CPoint(m_fX, m_fY);
	}
private:
	float m_fX;
	float m_fY;
};
//	形状サブクラス:線
class CLine final : public IShape
{
public:
	CLine() = default;
	CLine(float bx, float by, float ex, float ey) 
		: m_fBX(bx), m_fBY(by), m_fEX(ex), m_fEY(ey){}
public:
	virtual void Draw()
	{
		std::cout << "Line :" << "(" 
			<< m_fBX << "," << m_fBY << "," 
			<< m_fEX << "," << m_fEY << ")" << std::endl;
	}
public:
	//	複製を生成
	virtual IShape* Clone()
	{
		return new CLine(m_fBX, m_fBY, m_fEX, m_fEY);
	}
private:
	float m_fBX;
	float m_fBY;
	float m_fEX;
	float m_fEY;
};

ここでCloneメソッドに取り入れているのがPrototypeパターンになります。

自分を複製するメソッドが用意されているので
利用者は複製を行う際にサブクラスを知る必要がありません。

int main()
{
	IShape* pShape = nullptr;
	//	点が設定された
	pShape = new CPoint(5,10);
	if(pShape)
	{
		//	何が設定されたか知らずに複製出来る
		IShape* pClone = pShape->Clone();
		//	点 or 線 or それ以外かも
		pClone->Draw();
		//
		delete pClone;
		delete pShape;
		pShape = nullptr;
	}
	//	線が設定された
	pShape = new CLine(1,2,3,4);
	if(pShape)
	{
		//	何が設定されたか知らずに複製出来る
		IShape* pClone = pShape->Clone();
		//	点 or 線 or それ以外かも
		pClone->Draw();
		//
		delete pClone;
		delete pShape;
		pShape = nullptr;
	}
	return EXIT_SUCCESS;
}

実行結果

Point:(5,10)
Line :(1,2,3,4)

主な用途としては

  • オーサリングツール
  • アイテム
  • キャラの残像、分裂、群れ
  • パーティクル

等のサブクラスが多岐に渡るケースにおいて一括で複製や
それに類似した操作を行いたい場合に有効です。

Tags: