Created
June 15, 2021 23:10
-
-
Save masaki-shimura/5de81567058f0ee6b0f1bd3124a6208e to your computer and use it in GitHub Desktop.
【デザインパターン】プロトタイプ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
プロトタイプ のサンプルプログラム | |
説明 | |
生成クラスに設定したオブジェクトを簡単にコピーするデザイン | |
ポイント | |
・クローン出来るオブジェクトには、基底クラスを定義しておく | |
・生成クラスに 生成オブジェクトを設定する仕組みを作る | |
・生成クラスでクローンを呼ぶことで、オブジェクトを生成していく | |
・生成オブジェクトは自身のポインタを利用して、生成できるクローンメソッドを定義する | |
*/ | |
#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