Eve*_*ard 4 factory smalltalk factory-method
Smalltalk中是否使用了工厂方法,如果是这样,那么应该如何编写一个,而不是像Java中那样?谢谢.
Ala*_*erg 11
在工厂模式中,我们实例化一些子类而不命名它.考虑披萨工厂和层次结构:
Pizza
PepperoniPizza
CheesePizza
...
Run Code Online (Sandbox Code Playgroud)
我们想要在不知道它的类名的情况下实例化一个披萨子类.例如:
pizza := Pizza flavor: 'cheese' size: 12 inches
Run Code Online (Sandbox Code Playgroud)
回答正确的披萨子类,填充它的大小.
现在在Java或C++中,人们可能会做一个大的"switch"语句来比较不同的字符串名称.每次我们添加一个新的Pizza子类时,我们都需要记住添加到master switch语句中.有关典型示例,请参阅Wikipedia文章.
在Smalltalk中并非如此,其中类是第一类对象,因此我们可以迭代类层次结构,要求每个子类匹配.例如:
Pizza class>>flavor: aString size: anInteger
matchingClass := self subclasses detect: [:first | first matching: aString].
^matchingClass new size: anInteger.
Run Code Online (Sandbox Code Playgroud)
每当我们实现一个新的pizza子类时,我们都会实现一个方法来进行工厂匹配:
CheesePizza class>>matching: aString
^aString = 'cheese'
PepperoniPizza class>>matching: aString
^aString = 'pepperoni'
Run Code Online (Sandbox Code Playgroud)
没有中央交换机声明可以维护.只是对象!
| 归档时间: |
|
| 查看次数: |
954 次 |
| 最近记录: |