Smalltalk中是否使用了工厂方法,如果是这样,那么应该如何编写一个,而不是像Java中那样? 感谢。
答案 0 :(得分:11)
在工厂模式中,我们实例化一些子类而不命名它。考虑披萨工厂和层次结构:
Pizza
PepperoniPizza
CheesePizza
...
我们想要在不知道它的类名的情况下实例化一个披萨子类。例如:
pizza := Pizza flavor: 'cheese' size: 12 inches
回答披萨的正确子类,填写它的大小。
现在在Java或C ++中,人们可能会做一个大的'switch'语句来比较不同的字符串名称。每次我们添加一个新的Pizza子类时,我们都需要记住添加到master switch语句中。有关典型示例,请参阅Wikipedia article。
在Smalltalk中不是这样,其中类是第一类对象,因此我们可以迭代类层次结构,要求每个子类匹配。例如:
Pizza class>>flavor: aString size: anInteger
matchingClass := self subclasses detect: [:first | first matching: aString].
^matchingClass new size: anInteger.
每当我们实现披萨的新子类时,我们都会实现一种方法来进行工厂匹配:
CheesePizza class>>matching: aString
^aString = 'cheese'
PepperoniPizza class>>matching: aString
^aString = 'pepperoni'
无需维护中央交换机语句。只是对象!
答案 1 :(得分:0)
首先,在Smalltalk中,您已经命名了构造函数。实际上,类是对象,“构造函数”只是在类上定义的碰巧返回新实例的方法。可以通过这种方式涵盖其他语言中工厂方法的许多用法。
例如
Thing class >> withName: aString
^ dictionaryOfAllThings
at: aString
ifAbsentPut: (self new name: aString; yourself)
通过名称得到一个东西,并且只有当具有该名称的东西不存在时才创建新东西。