いつもお世話になります。
デザインパターンのFactory MethodをC++で実装しようとしている中で
疑問がございます。
サンプルコード
ファイル数多いですが、ご容赦ください。以下があります。
- 抽象ファクトリクラス(
abstract_factory.hpp
) - 具体ファクトリクラス(
concrete_factory.hpp/cpp
) - 生成されるクラスの抽象(
product.hpp
) - 生成される具体クラス(
pen.hpp/cpp
) - 上記の使い手(
main.cpp
) Makefile
cpp
1/* 1. abstract_factory.hpp */ 2#ifndef ABSTRACT_FACTORY_HPP_ 3#define ABSTRACT_FACTORY_HPP_ 4 5#include <string> 6class Product; 7 8class Factory { 9 public: 10 Product* create(std::string type) { 11 return createInstance(type); 12 } 13 private: 14 virtual Product* createInstance(std::string type) = 0; 15}; 16#endif
cpp
1/* 2. concrete_factory.hpp */ 2#ifndef CONCRETE_FACTORY_HPP_ 3#define CONCRETE_FACTORY_HPP_ 4 5#include "abstract_factory.hpp" 6 7class ConcreteFactory : public Factory { 8 private: 9 Product* createInstance(std::string type); 10}; 11#endif
cpp
1/* 3. concrete_factory.cpp */ 2#include <string> 3#include "concrete_factory.hpp" 4#include "pen.hpp" 5 6Product* ConcreteFactory::createInstance(std::string type) { 7 if (type == "Pen") { 8 return new Pen(); 9 } 10}
cpp
1/* 4. product.hpp */ 2#ifndef PRODUCT_HPP_ 3#define PRODUCT_HPP_ 4 5class Product { 6 public: 7 virtual void sayName() = 0; 8}; 9#endif
cpp
1/* 5. pen.hpp */ 2#ifndef PEN_HPP_ 3#define PEN_HPP_ 4 5#include "product.hpp" 6 7class Pen : public Product { 8 public: 9 void sayName(); 10}; 11#endif
cpp
1/* 6. pen.cpp */ 2#include <iostream> 3#include "pen.hpp" 4 5void Pen::sayName() { 6 std::cout << "I am a pen!" << std::endl; 7}
cpp
1/* 7. main.cpp */ 2#include "product.hpp" 3#include "concrete_factory.hpp" // IS THIS CORRECT ??? 4 5int main(void) { 6 7 Factory* factory = new ConcreteFactory(); 8 Product* product = factory->create("Pen"); 9 10 product->sayName(); // expects "I am a pen!" 11 12 return 0; 13}
Makefile
1# 8. Makefile 2test: main.cpp concrete_factory.cpp pen.cpp 3 g++ -std=c++11 $^
質問
main.cpp
において、concrete_factory.hpp
をインクルードしているのはFactory Methodの正しい実装でしょうか?
Product
については、pen.hpp
ではなくproduct.hpp
をインクルードしているので
抽象化できているなと納得できるのですが、Factory
側については具体クラスの方をインクルードせざるを得ないように思うのですが、
使い手側がファクトリの具体クラスのヘッダに依存してしまって良いのか、それが正しいやり方なのかを知りたいです。
その他
一応、有名な本2,3冊を読みつつ考えているのですが、使い手側のサンプルコードがあまり載っておらず
よく分からない状態です。
よろしくお願い申し上げます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/26 05:25
2019/05/26 05:27