工厂模式中的参数化工厂 - 是否存在其他方式?

时间:2010-12-09 14:19:13

标签: design-patterns architecture factory-method

我正在阅读Go4设计模式书,目前正在查看工厂方法模式。这本书提到了Pg:110

  

“工厂的另一个变种   pattern让工厂方法创建   多种产品。该   factory方法接受一个参数   识别对象的类型   创建“

现在不是工厂总是创造多种产品吗?另外,是不是总是需要发送参数来决定要创建哪种产品?我的意思是,如果我们不传递参数,工厂将如何决定创建哪个对象?他们对另一个虚荣的意思是什么?我在这里错过任何一点吗?

3 个答案:

答案 0 :(得分:2)

因为你有工厂和工厂方法,GOF会有点混乱。永远不确定哪一个是哪个。如果没有全文,很难说出你在说什么。

通常,只有您创建的工厂类型才能确定方法返回的内容,例如:如果你有比萨饼工厂,不同的方法会返回不同的比萨饼。但是工厂确定要创建哪些:每种方法的特定类型。这当然是有限的,因为除了选择使用哪个工厂之外,你对创建的内容没有任何影响,但是在你使用这个变体的框架中,这是整个想法。工厂从您手中取出选项,因此您没有责任选择。基本上你说'给我任何你有的'。例如。给我任何意大利辣香肠比萨饼。但工厂可以退回纽约意大利辣香肠比萨饼或超薄意大利辣香肠比萨饼,具体取决于您使用的工厂。

在某些情况下,工厂更像是一种策略。你不想知道它的作用,但是你仍然希望能够告诉它你想要接收哪种类型。该类型应该具有工厂可以使用的接口,或者工厂本身应该如此简单,不需要接口。在这里你说'给我一个这种类型的实例,做你通常用实例做的任何事'。例如。我想要这里披萨,还有额外的奶酪。

希望这有帮助。

答案 1 :(得分:1)

我认为他们在谈论继承类型。因此,如果您将产品作为父类和2个子类BetaProductFinishedProduct。您可以通过简单地传入某种更改工厂内控制流的参数来告诉工厂要创建哪种对象,BetaProductFinishedProduct。它总是根据工厂的信息设置对象的值......但是当它谈到产品的KIND时......就是子类的名称/类型。

答案 2 :(得分:0)

您的工厂可以从数据库或配置文件本身查找值,但这更有可能在工厂外部完成,然后传入。