Abstract Factory

  • 関連するオブジェクト群を具象クラスを明確にせずに生成する。
  • 新しい構成クラスの追加が困難。
  • 一緒に使用すべき部品の生成処理をグループ化できる。一緒に使用すべきでない部品どうしを誤って組み合わせることがなくなる。
  • 部品グループの切り替えが容易。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // abstract product class
  5. class DisplayDriver {
  6. public:
  7. virtual void DisplayOperation() = 0;
  8. };
  9.  
  10. // concrete product class
  11. class HighResDispDriver : public DisplayDriver {
  12. public:
  13. virtual void DisplayOperation() {
  14. cout << "High Resolution Display" << endl;
  15. }
  16. };
  17.  
  18. // concrete product class
  19. class LowResDispDriver : public DisplayDriver {
  20. public:
  21. virtual void DisplayOperation() {
  22. cout << "Low Resolution Display" << endl;
  23. }
  24. };
  25.  
  26. // abstract product class
  27. class PrinterDriver {
  28. public:
  29. virtual void PrinterOperation() = 0;
  30. };
  31.  
  32. // concrete product class
  33. class HighResPrintDriver : public PrinterDriver {
  34. public:
  35. virtual void PrinterOperation() {
  36. cout << "High Resolution Printer" << endl;
  37. }
  38. };
  39.  
  40. // concrete product class
  41. class LowResPrintDriver : public PrinterDriver {
  42. public:
  43. virtual void PrinterOperation() {
  44. cout << "Low Resolution Printer" << endl;
  45. }
  46. };
  47.  
  48. // abstract factory class
  49. class AbstractFactory {
  50. public:
  51. virtual DisplayDriver* CreateDisplayDriver() = 0;
  52. virtual PrinterDriver* CreatePrinterDriver() = 0;
  53. };
  54.  
  55. // concrete factory class
  56. class HighResFactory : public AbstractFactory {
  57. public:
  58. virtual DisplayDriver* CreateDisplayDriver() {
  59. return new HighResDispDriver;
  60. }
  61. virtual PrinterDriver* CreatePrinterDriver() {
  62. return new HighResPrintDriver;
  63. }
  64. };
  65.  
  66. // concrete factory class
  67. class LowResFactory : public AbstractFactory {
  68. public:
  69. virtual DisplayDriver* CreateDisplayDriver() {
  70. return new LowResDispDriver;
  71. }
  72. virtual PrinterDriver* CreatePrinterDriver() {
  73. return new LowResPrintDriver;
  74. }
  75. };
  76.  
  77.  
  78. // client
  79. int main(int argc, char **argv) {
  80. AbstractFactory *factory;
  81. DisplayDriver *display;
  82. PrinterDriver *printer;
  83.  
  84. for (int i=0; i<2; ++i) {
  85. if (i == 0) {
  86. factory = new HighResFactory;
  87. } else {
  88. factory = new LowResFactory;
  89. }
  90. display = factory->CreateDisplayDriver();
  91. printer = factory->CreatePrinterDriver();
  92. display->DisplayOperation();
  93. printer->PrinterOperation();
  94. delete factory;
  95. delete display; // ここで delete するのはどうか。。
  96. delete printer; // ここで delete するのはどうか。。
  97. }
  98. return 0;
  99. }
  100.  

出力
High Resolution Display
High Resolution Printer
Low Resolution Display
Low Resolution Printer


参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

デザインパターンの使い方: Abstract Factory
http://japan.internet.com/developer/20090512/26.html
最終更新:2012年01月30日 01:57