C++ 如何在factory design模式中设置派生产品类的数据成员
如何在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
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。