【问题标题】:How to set different properties from objects which are returned by the Factory pattern?如何从工厂模式返回的对象中设置不同的属性?
【发布时间】:2011-09-24 08:03:44
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案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()
    }
    }
    

    【讨论】:

    • 我对访问者模式不是很熟悉,但我应该将访问者模式与抽象工厂模式结合使用吗?
    • 谢谢,但是 ConcreteObjectVisitor 如何获得它的值呢?假设客户端知道密码和用户名,ConcreteObjectVisitor 是如何获取这些值的?
    • ConcreteObjectVisitor 通过参数获取值:ConcreteObject o = factory.GetObject();访客 v = 新访客(); v.SetParams(参数 p); o.accept(v);
    • 所以,当客户端需要设置一些属性时,客户端需要知道访问者,然后客户端可以将这个访问者作为参数发送给工厂。对吗?
    • 可以让Factory类负责设置初始参数。因为 Factory 知道具体类型,所以应该很容易做到:ConcreteObject o = factory.GetObject(Params initialParams);
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多