増補改訂版Java言語で学ぶデザインパターン入門 結城 浩 第6章 Prototype をC++で実装

自分のお勉強用 : デザパタ 結城本 第6章 Prototype をC++で適当に実装

C++とデザパタのリハビリを目的として。
Flyweightとなんか脳内で混同してしまう。まぁコンセプトは似てるし仕方ない。

ファイル一覧

  1. Product.h : インターフェイス
  2. ProdA.h と ProdA.cpp : 実装
  3. ProdB.h と ProdB.cpp : 実装
  4. Manager.h
  5. prototype_cpp.cpp : メインクラス

実装

Product.h : インターフェイス

#pragma once
#include 
using namespace std;
class Product
{
public :
	virtual ~Product() {}
	virtual void use(string s) = 0;
	virtual Product* createClone() = 0;
};

ProdA.h

#pragma once
#include "Product.h"
class ProdA : public Product
{
public:
	ProdA(string s):deco_(s) {}
	virtual void use(string s) override;
	virtual Product* createClone() override;
private:
	string deco_;
};

ProdA.cpp

#pragma once
#include "ProdA.h"
#include 
using namespace std;
void ProdA::use(string s)
{
	cout << deco_ << " : " << s << endl;
}

Product* ProdA::createClone()
{
	return new ProdA(deco_);
}

ProdB.h

#pragma once
#include "Product.h"
class ProdB : public Product
{
public:
	ProdB(string s): deco_(s) {}
	virtual void use(string s) override;
	virtual Product* createClone() override;
private:
	string deco_;
};

ProdB.cpp

#pragma once
#include "ProdB.h"
#include 
using namespace std;
void ProdB::use(string s)
{
	cout << deco_ << " : " << s << " : " << deco_ << endl;
}

Product* ProdB::createClone()
{
	return new ProdB(deco_);
}

Manager.h

#pragma once
#include 
#include "Product.h"
using namespace std;
class Manager
{
public :
	// 書籍では「register()」だけど、予約語で使えないらしい。
	void add(string name, Product* p) {
		showcase[name] = p;
	}
	Product* create(string name) {
		return showcase[name]->createClone();
	}
private :
	map<string, Product*> showcase;	//new とか要らないらしい。便利ね。
};

prototype_cpp.cpp

#pragma once
#include "Manager.h"
#include "Product.h"
#include "ProdA.h"
#include "ProdB.h"

int main()
{
	//準備
	Manager manager;
	ProdA proda("AAA");
	ProdB prodb("BBBBBBB");
	ProdB prodb2("************");
	manager.add("type1", &proda);
	manager.add("type2", &prodb);
	manager.add("type3", &prodb2);

	// 利用
	Product* p1 = manager.create("type1");
	p1->use("p1use");
	Product* p2 = manager.create("type2");
	p2->use("p2use");
	Product* p3 = manager.create("type3");
	p3->use("p3use");
}

所感

STLは便利。
実用の際はManagerのクラスをFactory的なものにしても便利そう。

コメント

このブログの人気の投稿

windows10 で nvidia のグラボのcode43現象を解決した

GTX560Ti がおかしい(code 43が出る)(2018年)→解決しました(2019)

Java : processbuilder 標準出力 タイムアウト