Prototypeパターン

「Prototype = 雛形」

自身のプロパティを受け継いだクラスインスタンスを生成するクローン関数を保持させることで実現する。

もちろん、生成に関わるデザインパターン

// クローン基底
class PrototypeBase
{
public:
virtual PrototypeBase* Clone();
};

// クローン羊
class Sheep : public PrototypeBase
{
public:
enum
{
FAR_COLOR_WHITE,
FAR_COLOR_RED, // 赤毛とかありえんけど
};
enum
{
EYE_COLOR_BLACK,
EYE_COLOR_RED, // 充血?
};

private:
int m_iFarColor; // 毛の色
int m_iEyeColor; // 目の色

public:
Sheep()
{
m_iFarColor = FAR_COLOR_WHITE;
m_iEyeColor = EYE_COLOR_BLACK;
}
Sheep(int FarColor,int EyeColor)
{
m_iFarColor = FarColor;
m_iEyeColor = EyeColor;
}
~Sheep(){}

public:
// クローン生成
virtual PrototypeBase* Clone()
{
// 自らのパラメータを全てコピーする。
// この時、ポインタがある場合注意(shallow,deepコピーを適切に使い分ける)
Sheep* pClone = new Sheep();
pClone->m_iFarColor = m_iFarColor;
pClone->m_iEyeColor = m_iEyeColor;
return pClone;
}
};


int main()
{
// メリーさんの羊が誕生
Sheep Mery(Sheep::FAR_COLOR_WHITE,Sheep::EYE_COLOR_BLACK);

// そしてクローンも誕生
Sheep* pMeryClone = dynamic_cast(Mery.Clone());

// 充血気味のメリーさんの羊が誕生
Sheep CongestiveMery(Sheep::FAR_COLOR_WHITE,Sheep::EYE_COLOR_RED);

// またまたクローンも誕生
Sheep* pCongestiveMeryClone = dynamic_cast(CongestiveMery.Clone());

// 早くもこの世とお別れです
delete pMeryClone;
delete pCongestiveMeryClone;

// この世もお別れ(オリジナルもここでさいなら)
return 0;
}

注:実行確認はしてません。


同じものを大量に作る必要がある場合に役に立つかものう。

座標や色は別設定していたけど、以前ゲームでエフェクトパーティクル作ったときに使ったことがあるかもしれない。

もちろん、記憶は確かではない。