我正在阅读 Go4 设计模式书,目前正在研究工厂方法模式。这本书在 Pg:110 上提到
“工厂模式的另一种变体让工厂方法创建多种产品。工厂方法采用一个参数来标识要创建的对象的种类”
现在工厂不总是生产多种产品吗?另外,是否总是需要发送参数来决定要创建什么样的产品?我的意思是,如果我们不传递参数,工厂将如何决定创建哪个对象?他们所说的另一个变化是什么意思?我在这里错过任何一点吗?
我正在阅读 Go4 设计模式书,目前正在研究工厂方法模式。这本书在 Pg:110 上提到
“工厂模式的另一种变体让工厂方法创建多种产品。工厂方法采用一个参数来标识要创建的对象的种类”
现在工厂不总是生产多种产品吗?另外,是否总是需要发送参数来决定要创建什么样的产品?我的意思是,如果我们不传递参数,工厂将如何决定创建哪个对象?他们所说的另一个变化是什么意思?我在这里错过任何一点吗?
GOF 可能有点令人困惑,因为您有工厂和工厂方法。永远不确定哪个是哪个。如果没有全文,很难判断您在说什么。
通常只有你创建的工厂类型决定了方法返回什么,例如,如果你有一个比萨工厂,不同的方法返回不同的比萨。但是工厂决定创建哪些:每种方法的特定类型。这当然在一个方面受到限制,因为除了选择要使用的工厂之外,您对创建的内容没有任何影响,但在您使用此变体的框架中,这就是整个想法。工厂将选择权从您手中夺走,因此您没有选择的责任。基本上你说'给我你所有的'。例如,给我任何意大利辣香肠披萨。但是工厂可以退回纽约意大利辣香肠比萨饼或超薄意大利辣香肠比萨饼,具体取决于您使用的工厂。
在某些情况下,工厂更像是一种战略。您不想知道它的作用,但您仍然希望能够告诉它您想要接收哪种类型。该类型应该具有工厂可以使用的接口,或者工厂本身应该非常简单以至于不需要接口。在这里你说'给我一个这种类型的实例,做你通常用实例做的任何事情'。例如,我想要这个披萨,加额外的奶酪。
希望这可以帮助。
我认为他们在谈论继承的类型。因此,如果您将产品作为父类和 2 个子类BetaProduct
,并且FinishedProduct
. 你可以告诉工厂要创建什么样的对象,aBetaProduct
或 aFinishedProduct
通过简单地传递某种参数来改变工厂内的控制流。它总是会根据工厂拥有的信息来设置对象的值……但是当它谈到产品的种类时……那就是子类的名称/类型。
您的工厂可以从数据库或配置文件本身中查找值,但是这更有可能在工厂之外完成然后传入。