Skip to content

Instantly share code, notes, and snippets.

@masaki-shimura
Created June 15, 2021 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save masaki-shimura/5de81567058f0ee6b0f1bd3124a6208e to your computer and use it in GitHub Desktop.
Save masaki-shimura/5de81567058f0ee6b0f1bd3124a6208e to your computer and use it in GitHub Desktop.
【デザインパターン】プロトタイプ
/*
プロトタイプ のサンプルプログラム
説明
生成クラスに設定したオブジェクトを簡単にコピーするデザイン
ポイント
・クローン出来るオブジェクトには、基底クラスを定義しておく
・生成クラスに 生成オブジェクトを設定する仕組みを作る
・生成クラスでクローンを呼ぶことで、オブジェクトを生成していく
・生成オブジェクトは自身のポインタを利用して、生成できるクローンメソッドを定義する
*/
#include <iostream>
#include <string>
using namespace std;
// Prototype
class Block
{
public:
virtual Block* clone() = 0;
string m_color;
};
// ConcretePrototype
// 四角形
class StoneBlock: public Block
{
public:
//プロパティ情報を直接設定する
StoneBlock(string _color)
{
this->m_color = _color;
}
// オブジェクトからプロパティ情報をコピーする
StoneBlock( Block const &_block)
{
this->m_color = _block.m_color;
}
//自身を生成する
Block* clone()
{
cout << "StoneBlock:自身をnewしました。\n";
//自身の実態を使ってオブジェクトを生成する
return new StoneBlock(*this);
}
//行動
void action()
{
cout << "アクションをする\n";
}
};
// Client
class BlockMaker
{
public:
BlockMaker(Block* _block)
{
cout << "BlockMaker : 生成ブロックを設定します\n";
this->m_block = _block;
}
Block* makeBlock()
{
cout << "BlockMaker : ブロックを生成します。\n";
return m_block->clone();
}
private:
Block* m_block;
};
int main(void){
StoneBlock _stoneBlock("Red");
BlockMaker _blockMaker(&_stoneBlock);
// 岩ブロックをブロックとして生成する
Block* pCopyBlock1 = _blockMaker.makeBlock();
// 岩ブロックとして生成して、アクションする
StoneBlock* pCopyBlock2 = (StoneBlock*)_blockMaker.makeBlock();
pCopyBlock2->action();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment