如何设置Factory模式返回的对象的不同属性?

时间:2011-09-24 08:03:44

标签: oop design-patterns factory factory-pattern abstract-factory

我想知道如何设置混凝土工厂返回的对象的属性。工厂可以返回具有属性A和B的objectA,但它也可以返回具有属性X,Y,Z的objectB。

由于客户端只知道接口objectA和objectB继承,因此它不知道他正在处理哪个对象。所以,我的问题是,设置这些属性的OO方式是什么?我是否需要引入一种设置类,它包含classA和classB的所有属性?但这不是OO,因为当有一个新类时,我也必须更新设置类......

我希望你能解开我的问题并帮助我:)

PS:如果重要,我正在使用C#

2 个答案:

答案 0 :(得分:1)

您可以使用访问者知道要设置哪些属性,并将其分配给您获得的具体类(在工厂内)。现在这个访问者可以用抽象的方式设置所需的属性。

class Factory {

..
obj = new ConcreteObject();
obj.accept(new ConcreteObjectVisitor());
}

class ConcreteObject{

accept(Visitor visitor){
 visitor.visit(this);
}

}

class ConcreteObjectVisitor implements Visitor {

visit(ConcretTypeInterface param){

obj = (ConcretType)param;
param.setA()
param.setB()
param.setC()
}
}

答案 1 :(得分:0)

如果客户需要设置不存在于公共接口中的属性值,则必须对工厂创建的具体对象类型有所了解。有几种方法:

  1. 客户端决定它需要什么类型的对象并调用适当的工厂操作。因此,对于这种情况,工厂将有不同的操作来创建objectA和objectB。要设置的属性值可以作为这些操作的参数传递。

  2. 客户端决定它需要什么样的对象,并将此决定作为工厂方法参数的值传递给工厂。值本身作为单个数组,集合或字典对象在另一个参数中传递。

  3. 工厂决定要实例化的类,将新实例传递给客户端,然后客户端发现给定对象的具体类(通过GetType()方法在C#中)。如果客户端可以访问具体类,它可以执行强制转换,如果没有,它可以使用反射设置属性值。

  4. 如果需要示例,只需撰写评论: - )

相关问题