【发布时间】:2009-07-22 15:41:38
【问题描述】:
在抽象工厂中,您声明一个负责创建对象的类型。
这将防止像这样要求开关:
if( type == ONE ) {
doOne();
} else if( type == TWO ) {
doTwo();
} etc.
还是一样的:
switch( type ) {
case ONE: doOne(); break;
case TWO: doTwo(); break;
etc....
}
进入这个:
MyAbstractFactory factoryInstance = ... ?
SomeObject object = factoryInstance.createObject();
object.doX();
据我了解,AbstractFactory 将创建正确的对象,而该对象又将以多态方式执行正确的行为。
然后,如果您在程序中使用该对象 10-20 或 100 次,则不必每次都重复切换。您只需执行相应的方法并让多态性完成这项工作。
object.doY();
object.doZ();
添加新类型就像创建新的具体工厂一样简单。
这一切我都很清楚。但是……
混凝土工厂最初是在哪里或如何创建的(一般而言)?
我一直使用一个点(通常在 main() 方法或 Configuration.init() 方法中),而这又具有 if/else|switch 结构,这是不可避免的,但至少它只被使用一次。
但是我是“本能地”(或根据常识)这样做的,但从未读过任何描述应该在哪里创建模式的文档。
:)
【问题讨论】:
-
这是一个技巧问题吗?听起来您已经在倒数第二段中回答了它!
-
为什么不直接使用 Spring 和它提供的 bean factory?
-
THE if else/switch 不是不可避免的,但很可能是性能最好的实现。 (你基本上需要一个跳转表,如果你打开一个 int 这就是你将从 switch 块中得到的。但你可以使用一个创建者数组和一些索引(你需要的类型)
-
@Jeff:差不多。我解释了如何使用它,但问题是这是否是正确的方法和/或有哪些替代方法,因为文献中没有任何地方(GoF、c2.com、维基百科等)说或建议如何实例化抽象工厂.
-
@Oscar:我更新了我的答案(这更像是一个讨论)。请看一看。
标签: c# java design-patterns oop instantiation