【问题标题】:How do you set specific properties to a class created by an abstract factory?如何为抽象工厂创建的类设置特定属性?
【发布时间】:2011-03-09 20:00:33
【问题描述】:

是否可以让具体工厂使用抽象工厂模式为它们创建具有类型特定参数的具体类?还是各自具体工厂创建的不同具体类需要有相同的字段?

例如)在下图中,您将如何使用客户端(应用程序)给出的不同参数集来实例化 WinButton 和 OSXButton?

【问题讨论】:

    标签: oop design-patterns language-agnostic factory-pattern


    【解决方案1】:

    解决此类问题的方法之一是发送对象参数。例如,在 C# 中,Object 是基类,您可以传递 Object 类型的参数,该参数可以采用任何派生类。在实现中,可以将此对象转换回所需的派生类型。甚至可以通过这种方式设置特定属性。

    【讨论】:

    • 使用 Object 类作为泛型类型,然后将其转换为特定类并不是一个很好的解决方案,因为它不是类型安全的,并且它至少违反了一个面向对象的原则,即 Liskov 替换原则。此外,要创建的具体类可能需要不同数量的参数用于各自的构造。
    • 我同意,它不是类型安全的。关于不同数量的参数,您可以拥有由其他类型组成的类型。
    • 您的意思是存储不同具体类型的创建参数的数据结构?在这种情况下,每次添加新结构时都必须更改数据结构。
    【解决方案2】:

    如果没有更多细节,这并不容易。我会做的一件事是尝试将参数传递给具体工厂类的构造函数。对于不同的参数,您必须创建不同的工厂实例,这可能不是最好的解决方案,但如上所述,这取决于细节。

    例子:

    GUIFactory factory = new WinFactory(WIN_9x_THEME); 按钮 grayButton = factory.createButton(); 工厂=新WinFactory(WIN_VISTA_THEME,50); 按钮 semiTransparentButton = factory.createButton();

    【讨论】:

    • 这是一种方法,但您有点错过了模式的抽象性,因为正如您所指出的,工厂类必须为每组新的参数值重新实例化。您不妨直接实例化具体类,而不是通过工厂类。
    • @Christian: 不是真的......如果你在编码过程中知道参数集的组合,你可以为工厂创建工厂——这有点复杂,所以也许基于依赖注入的解决方案可以更有意义。最后,这一切都取决于特定的语言和应用程序。
    • hmmm...工厂的工厂;你可能有一个代码示例吗?关于它取决于语言和应用程序,模式不应该与语言和应用程序无关吗?
    • @Christian:首先是模式——它们不是根据定义。每个模式都有其适用的上下文。例如,如果您想创建对象系列,则可以使用抽象工厂。如果你想创建非常不同的 WinButtons 和 OSXButtons,也许抽象工厂不是正确的选择。谈到语言,许多语言概念直接解决了某些模式的问题,因此使它们在该语言中过时了。示例可能是多方法和猴子补丁,它们解决的问题与访问者模式类似。
    • @Christian:现在到工厂。不说你的问题很难说什么是好的,工厂的工厂可能对你不利。如果您想了解使用工厂的不同方式,Head First Design Patterns 书籍中有很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多