如何在工厂设计模式中设置派生产品类的数据成员

时间:2014-11-16 16:11:48

标签: c++ design-patterns factory-pattern

如何在工厂设计模式中设置派生产品类的数据成员?

class Factory
{
  public:
     product* Create(int type)
     {
        switch (type)
        {
           case 1:
             return new product1;
           break;
           case 2:
             return new product2;
           break;
        }
     }
};

class product
{
  int a;
  public :
  product(); 
  product(int a); 
  void seta (int a);
};

class product1:public product
{
  int b;
public:
  product1();
  product1(int a,int b):product(a), b(b) {}
  void setb (int b);
};

class product2:public product
{
  int c;
public:
  product2();
  product2(int a, int c):product(a), c(c) {}
  void setc (int c);
};


\\ client code 

void main()
{
  Factory f;
  product* p = f.create(1); // product1 created
  p->seta(2);
  // now how to set value b of product1
}

注意:如果我将p向下转换为p1,那么就没有使用工厂的意义了。 因此,不知道如何使用它。

编辑: 为产品,product1,product2添加了set方法。 如果使用工厂创建product1,如何在main中设置b的值?

2 个答案:

答案 0 :(得分:0)

product可能有一些(纯)虚拟方法。调用此类方法的效果取决于对象的动态类型,不需要向下转换。

答案 1 :(得分:0)

理想情况下,b会在Factory期间由create设置b。有什么理由不可能吗?

如果不这样做,您可能需要通过virtual上的Product方法设置virtual。最好通过Product方法在所有b s。

的上下文中有意义

Product::setThingsFromFile(string file)的价值来自哪里?例如,假设值来自文件,拥有虚拟方法virtual可能是有意义的。覆盖Product1中的b方法,从文件中设置b

可能有点矫枉过正,但您可以考虑使用Visitor Pattern并在ConcreteVisitor::visit(Product1& product)方法中设置virtual void Product::setB(int b)

作为最后的手段,您可以添加Product,这对于大多数Product1来说都是无操作,并且实际上只对Product执行任何操作,但它不是一个好消息一般的想法,是一个混乱Product的好方法。

请记住,工厂的要点是客户端代码不应该知道它正在使用的Product1,所以如果它需要知道它有b来设置{ {1}}然后使用工厂没什么意义。