2

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

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

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

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

4

2 回答 2

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()
}
}
于 2011-09-24T08:11:59.040 回答
1

如果客户端需要设置通用接口中不存在的属性值,它必须对工厂创建的具体对象类型有一些了解。有几种方法:

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

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

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

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

于 2017-07-24T17:12:28.353 回答