Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何为抽象工厂创建的类设置特定属性?_Oop_Design Patterns_Language Agnostic_Factory Pattern - Fatal编程技术网

Oop 如何为抽象工厂创建的类设置特定属性?

Oop 如何为抽象工厂创建的类设置特定属性?,oop,design-patterns,language-agnostic,factory-pattern,Oop,Design Patterns,Language Agnostic,Factory Pattern,是否可以让具体工厂使用抽象工厂模式为它们创建具有特定类型参数的具体类?或者由各自的混凝土工厂创建的不同混凝土类是否需要具有相同的字段 Ex)在下图中,您将如何使用客户端(应用程序)提供的不同参数集实例化WinButton和OSXButton 解决此类问题的方法之一是发送对象参数。例如,在C中,Object是基类&您可以传递Object类型的参数,它可以接受任何派生类。在实现中,可以将该对象转换回所需的派生类型。甚至可以通过这种方式设置特定属性 没有更多细节,这并不容易。我要做的一件事是尝试将参数

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

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


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

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

例如:

GUIFactory factory = new WinFactory(WIN_9x_THEME); Button greyButton = factory.createButton(); factory = new WinFactory(WIN_VISTA_THEME, 50); Button semiTransparentButton = factory.createButton(); GUI工厂=新的WinFactory(WIN_9x_主题); Button greyButton=factory.createButton(); 工厂=新的WinFactory(WIN_VISTA_主题,50); 按钮半透明按钮=工厂.createButton();
将对象类用作泛型类型,然后将其强制转换为特定类不是一个很好的解决方案,因为它不是类型安全的,并且至少违反了一个面向对象的原则,即Liskov替换原则。此外,要创建的具体类可能需要不同数量的参数用于各自的构造。我同意,这不是类型安全的。关于不同数量的参数,您可以有一个由其他类型组成的类型。您是指存储不同具体类型的创建参数的数据结构吗?在这种情况下,每次添加新结构时都必须更改数据结构。这是一种方法,但您缺少了模式的抽象性,因为正如您所指出的,必须为每一组新参数值重新实例化工厂类。你最好直接实例化Conrecte类,而不是通过工厂类。@Christian:不太可能。。。如果您在编码过程中知道参数集的组合,您可以为工厂创建工厂-这有点复杂,因此基于依赖项注入的解决方案可能更有意义。最后,这一切都取决于特定的语言和应用程序;你可能有一个代码示例吗?关于它取决于语言和应用程序,难道模式不应该是语言和应用程序不可知的吗?@Christian:首先是模式-它们不是定义上的。每个模式都有其适用的上下文。例如,如果要创建对象族,则可以使用抽象工厂。如果您想创建非常不同的WinButtons和OSXButtons,那么抽象工厂可能不是正确的选择。当涉及到语言时,许多语言概念直接解决了某些模式的问题,从而使它们在该语言中过时。例如multimemethods和monkeypatching,它解决了与访问者模式类似的问题。@Christian:现在转到工厂。如果不说明你的问题,很难说什么是好的,工厂的工厂可能对你不好。如果您想了解使用工厂的不同方式,可以在Head First Design Patterns书籍中找到很好的解释。