基于参数在基类中创建派生类

sig*_*igy 4 c++ design-patterns derived-class object-construction

我的问题或多或少与需要一个设计模式去除对象创建中的枚举和切换语句的问题相同但是我没有看到抽象工厂模式适合这里.

我目前正计划对一些现有的DAL/ORM混合库进行重构/重新实现.在现有代码中的某处,代码如下所示:

class Base
{
  static Base * create(struct Databasevalues dbValues)
  {
    switch(dbValues.ObjectType)
    {
    case typeA:
      return new DerivedA(dbValues);
      break;
    case typeB:
      return new DerivedB(dbValues);
      break;
    }
  }
}

class DerivedA : public Base
{
  // ...
}

class DerivedB : public Base
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

因此,负责数据库通信的库使用有关数据库实体的所有信息填充结构,然后调用上述create()方法以在ORM中实际创建相应的对象.但我不喜欢基类知道所有派生类的想法,我也不喜欢switch语句.我还想避免创建另一个类只是为了创建这些对象.您如何看待当前的方法?你会如何实现这个功能?

小智 6

这已经在这里讨论了数百次.如果您不想创建单独的工厂类,则可以执行此操作.

class Base
{

public:
    template <class T>
    static void Register  (TObjectType type)
    {
       _creators[type] = &creator<T>;
    }

    static Base* Create (TObjectType type)
    {
        std::map <TObjectType, Creator>::iterator C = _creators.find (type);
        if (C != _creators.end())
          return C->second ();

        return 0;        
    }

private:
    template <class T>
    static Base* creator ()
    {
        return new T;
    }

private:
    typedef Base* (::*Creator) ();
    static std::map <TObjectType, Creator> _creators;
};

int main ()
{
   Base::Register <Derived1> (typeA);
   Base::Register <Derived2> (typeB);

   Base* a = Base::Create (typeA);
   Base* b = Base::Create (typeB);
}
Run Code Online (Sandbox Code Playgroud)