増補改訂版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 : インターフェイス

  1. #pragma once
  2. #include
  3. using namespace std;
  4. class Product
  5. {
  6. public :
  7. virtual ~Product() {}
  8. virtual void use(string s) = 0;
  9. virtual Product* createClone() = 0;
  10. };

ProdA.h

  1. #pragma once
  2. #include "Product.h"
  3. class ProdA : public Product
  4. {
  5. public:
  6. ProdA(string s):deco_(s) {}
  7. virtual void use(string s) override;
  8. virtual Product* createClone() override;
  9. private:
  10. string deco_;
  11. };

ProdA.cpp

  1. #pragma once
  2. #include "ProdA.h"
  3. #include
  4. using namespace std;
  5. void ProdA::use(string s)
  6. {
  7. cout << deco_ << " : " << s << endl;
  8. }
  9. Product* ProdA::createClone()
  10. {
  11. return new ProdA(deco_);
  12. }

ProdB.h

  1. #pragma once
  2. #include "Product.h"
  3. class ProdB : public Product
  4. {
  5. public:
  6. ProdB(string s): deco_(s) {}
  7. virtual void use(string s) override;
  8. virtual Product* createClone() override;
  9. private:
  10. string deco_;
  11. };

ProdB.cpp

  1. #pragma once
  2. #include "ProdB.h"
  3. #include
  4. using namespace std;
  5. void ProdB::use(string s)
  6. {
  7. cout << deco_ << " : " << s << " : " << deco_ << endl;
  8. }
  9. Product* ProdB::createClone()
  10. {
  11. return new ProdB(deco_);
  12. }

Manager.h

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

prototype_cpp.cpp

  1. #pragma once
  2. #include "Manager.h"
  3. #include "Product.h"
  4. #include "ProdA.h"
  5. #include "ProdB.h"
  6.  
  7. int main()
  8. {
  9. //準備
  10. Manager manager;
  11. ProdA proda("AAA");
  12. ProdB prodb("BBBBBBB");
  13. ProdB prodb2("************");
  14. manager.add("type1", &proda);
  15. manager.add("type2", &prodb);
  16. manager.add("type3", &prodb2);
  17.  
  18. // 利用
  19. Product* p1 = manager.create("type1");
  20. p1->use("p1use");
  21. Product* p2 = manager.create("type2");
  22. p2->use("p2use");
  23. Product* p3 = manager.create("type3");
  24. p3->use("p3use");
  25. }

所感

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

コメント

このブログの人気の投稿

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

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

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