如何在工厂设计模式中设置派生产品类的数据成员?
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的值?
答案 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}}然后使用工厂没什么意义。