2010-06-29 62 views
3

是否有可能让具体工厂使用抽象工厂模式创建具有类型特定参数的具体类?还是由他们各自的混凝土工厂创建的不同具体类需要具有相同的领域?在下面的图像中,你将如何用客户端(应用程序)给出的不同参数集来实例化WinButton和OSXButton?如何为抽象工厂创建的类设置特定属性?

enter image description here

回答

0

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

+0

使用Object类的泛型类型,然后将其投射到一个特定的类不是因为它很好的解决不是类型安全的,它违反了至少一个面向对象的原则即Liskov替代原则。此外,要创建的具体类可能需要为其各自的构造提供不同数量的参数。 – Christian 2011-05-19 06:34:32

+0

我同意,它不是类型安全的。关于不同数量的参数,你可以有一个由其他类型组成的类型。 – 2011-05-19 07:41:51

+0

您的意思是一个数据结构,您可以在其中存储不同具体类型的创建参数?在这种情况下,每次添加新结构时都必须更改数据结构。 – Christian 2011-05-19 10:05:30

0

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

例子:

 
    GUIFactory factory = new WinFactory(WIN_9x_THEME); 
    Button greyButton = factory.createButton(); 
    factory = new WinFactory(WIN_VISTA_THEME, 50); 
    Button semiTransparentButton = factory.createButton(); 
+0

这是做这件事的一种方式,但你有点遗漏模式的抽象性,因为正如你所指出的那样,工厂类将不得不为每一组新的参数值重新实例化。你可以直接实例化concrecte类而不是通过工厂类。 – Christian 2011-06-27 06:26:08

+0

@Christian:不是真的......如果你在编码过程中知道各组参数的组合,你可以为工厂设置工厂 - 这有点复杂,所以基于依赖注入的解决方案更有意义。最后,这一切都取决于具体的语言和应用。 – 2011-06-27 08:11:29

+0

嗯......工厂工厂;你可能有代码示例?关于它取决于语言和应用程序,是不是模式应该是语言和应用程序不可知的? – Christian 2011-06-27 20:30:34