Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在factory design模式中设置派生产品类的数据成员_C++_Design Patterns_Factory Pattern - Fatal编程技术网

C++ 如何在factory design模式中设置派生产品类的数据成员

C++ 如何在factory design模式中设置派生产品类的数据成员,c++,design-patterns,factory-pattern,C++,Design Patterns,Factory Pattern,如何在factory design模式中设置派生产品类的数据成员 class Factory { public: product* Create(int type) { switch (type) { case 1: return new product1; break; case 2: return new product

如何在factory design模式中设置派生产品类的数据成员

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,则没有使用工厂的意义。 因此我不知道如何使用它

编辑: 为产品、产品1、产品2添加了set方法。 如果product1是使用factory创建的,那么如何在main中为b设置值?

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

理想情况下,b将由工厂在创建过程中设置。有什么理由不可能做到这一点吗

否则,您可能必须通过产品上的虚拟方法设置b。最好通过在所有产品的上下文中有意义的虚拟方法

b的值来自哪里?例如,假设该值来自一个文件,那么使用虚拟方法Product::setThingsFromFilestring文件可能是有意义的。在Product1中重写此虚拟方法以从文件中设置b

可能有点过头,但您可以考虑在Cube访问者中使用“和”B::VisualStudio1和产品方法。

作为最后的手段,您可以添加一个虚拟的void Product::setBint b,它对于大多数产品来说都是不可行的,并且实际上只对产品1做任何事情,但这通常不是一个好主意,而且是一个将产品弄得一团糟的好方法


请记住,工厂的意义在于客户机代码不需要知道它使用的是什么产品,因此如果它需要知道它有一个Product1来设置b,那么使用工厂就没有什么意义。

这不会编译-Product1和product2没有零参数构造函数。只需给它们提供构造函数,这些构造函数接受与它们要初始化的成员数量相同的参数,并从Factory::Create调用这些构造函数。你们的描述不太清楚,我想,工厂应该在哪里取a,b和c的实际值。请看我的编辑部分。让ssay product1需要1个参数来构造它,product2需要2那么除了类型Factory::Createtype,a或Factory::Createtype,a,b之外,我应该向Factory::Create传递多少个参数;这种设计没有多大意义。大概,拥有工厂的目的是为了在统一接口后面对客户机隐藏实现细节。但是,如果客户机必须知道每种产品需要哪种类型的参数才能调用Factory::Create,那么这就违背了整个要点——有了这些知识,客户机还不如直接创建product1和product2。