使用工厂方法合并不同的类(c ++)

时间:2016-07-20 19:45:07

标签: c++ design-patterns

我提供以下代码来说明我的问题:

class Basic 
{
  public:
      Basic();
      ~Basic();
};

class ExtendA: public Basic
{
  public:
      class Para
      {
       };
      Para para_;

};
class ExtendB: public Basic
{
   public:
    class Para
    {

     };
    Para para_;
};

enum Method
{
   MedExtendA, 
   MedExtendB,
   MedExtendAVar1,
   MedExtendBVar1
};

class Enginee
{
 public: 
     class Para()
     {
      public:
         ExtendA::Para paraA_;
         ExtendB::Para paraB_;
     };
     Para paraEnginee_;
     Enginee(Method med)
     {
         switch(med):
         {
           case MedExtendA:
              pBasic.reset(new ExtendA());
              break;
           case MedExtendAVar1:
              pBasic.reset(new ExtendA());
              ExtendA *p = dynamic_cast<ExtendA *> (pBasic.get());
              p.para_ = ; // set the parameter
              break;
           case MedExtendB:
                 ...
              break;
           case MedExtendBVar1:
                  ...
              break;

         }
     }
     ~Enginee()
     {
      }
     boost::shared_ptr<Basic> pBasic;
 };

从上面的示例中,我们可以看到Basic是基类,而ExtendAExtendB是基于Basic类的派生类。 class Enginee是一个工厂类,有助于调用其他类。需要Enginee类的原因可以在以下示例中显示:

没有Enginee类:

ExtendA objA;
objA.para_ /// parameter setting
objA.do_something(); 

使用Enginee类:

   Enginee myEngine(MedExtendAVar1);
     myEngine.do_something();

总之,使用工厂方法构造Enginee类为使用ExtendAExtendB类提供了统一的接口。在上面的例子中,根据参数设置,我们可以创建不同类的类,可以很容易地调用它们。但是,它也使代码更复杂。所以这是我的问题:还有其他替代解决方案吗?建议的解决方案有什么问题?

1 个答案:

答案 0 :(得分:3)

  

工厂方法是合并不同类的唯一方法吗?

没有

我不太确定我是否理解你的问题。但是,如果我这样做,并且您在询问工厂类是否是实例化派生类并获得指向它们的基类指针的唯一方法,那么答案是&#34; no&#34;。

你可以做Base* b = new ExtendA;

如果我误解了你的问题,那么请忽略我的答案,但请尝试澄清这个问题。