海外旅行から帰ってきたら、まず何を食べる?

現在Factoryパターンを実装しようと思っているのですが、良くわかりません...
とりあえず、例を挙げます。

//ーーーーーーーーーーーーーーーーーーーーー
class IBase {
public:
   virtual void init() = 0;
};

class CA : public IBase {
public:
   virtual void init() override {}
};

class CB : public IBase {
public:
   virtual void init() override {}
};

//ーーーーーーーーーーーーーーーーーーーーー
class IFactory {
public:
   virtual vector<shared_ptr<IBase>> create() = 0;
};

class CAFactory : public IFactory {
public:
   virtual vector<shared_ptr<IBase>> create() override {
      vector<shared_ptr<IBase>> list;
      list.push_back(make_shared<CA>());
      list.push_back(make_shared<CA>());
      list.push_back(make_shared<CB>());
      return list;
   }
};

class CBFactory : public IFactory {
public:
   virtual vector<shared_ptr<IBase>> create() override {
      vector<shared_ptr<IBase>> list;
      list.push_back(make_shared<CB>());
      list.push_back(make_shared<CB>());
      list.push_back(make_shared<CA>());
      return list;
   }
};

//ーーーーーーーーーーーーーーーーーーーーー
class manager {
public:
   void init() {
     shared_ptr<IFactory> factory = make_shared<CAFactory>();
     list = factory->create();
   }

   void change(string name) {
      shared_ptr<IFactory> factory;
      if (name.c_str() == "CAFactory") {
        factory = make_shared<CAFactory>();
      }
      else if (name.c_str() == "CBFactory") {
        factory = make_shared<CBFactory>();
      }
      list = factory->create();
   }
private:
   vector<shared_ptr<IBase>> list;
};
//ーーーーーーーーーーーーーーーーーーーーー

このような形になっています。
本当はIBaseの部分はSceneになっていて、FactoryはSceneFactoryとして作っていますが、
分かりやすさ重視で省略しまくってます。

それで本題なのですが、この作り方はFactoryパターンで合っているのでしょうか?
合っているならAbstract FactoryパターンとFactory Methodパターンのどちらに当たるのでしょうか?
いまいちこの二つの違いが判らくて...色々なサイトを見ましたがなんとも...

ご指摘がありましたらどうぞ遠慮なくいってください!!!
(Sceneがリスト化されているのは、Unityのマルチシーンのようなものを作ろうとしているからです。)

A 回答 (1件)

このソースを見る限りでは 、どう見てもAbstract Factory ですね。



Factory Method はメソッドに生成を委譲
Abstract Factory はオブジェクトに生成を委譲。

Factory Methodは通常、オブジェクト生成用のクラスは作らず、
アプリのサブクラス群に共通のインターフェースの生成メソッド
を追加します。

Abstract Factory は通常クラスファミリーの選択に使います。
なので、生成メソッドがー個なら使わないでしょうが、
それは本当のコード次第ですね。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!