2010-06-25 61 views
4

Smalltalk中是否使用了工廠方法,如果是的話,那麼應該如何編寫一個,而不是它們在Java中的方式? 謝謝。Smalltalk相當於一種工廠方法?

+0

我還沒有找到答案,但在slideshare.net上找到[this](http://www.slideshare.net/speludner/layers-of-smalltalk-application)以及一些關於Factory的幻燈片,可能會有所幫助。 – 2010-06-25 20:22:49

回答

11

在一個工廠模式中,我們實例化了一些沒有命名的子類。考慮一個比薩工廠和等級:

Pizza 
    PepperoniPizza 
    CheesePizza 
    ... 

我們希望實例化一個披薩子類而不知道它是類名。例如:

pizza := Pizza flavor: 'cheese' size: 12 inches 

回答比薩的右子類,它填補了它的大小

現在在Java或C++一個可能會做一個大的「開關」的語句在不同的字符串名稱比較。每次我們添加一個新的Pizza的子類時,我們都需要記住添加到主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' 

沒有中央的開關語句來維護。只是物件!

+0

「現在在Java或C++中,可能會做一個大型的」switch「語句來比較不同的字符串名稱」---您的Smalltalk示例與「匹配」相當於使用Java反射和動態類加載,這就是除了工廠最微不足道的情況之外,我都是用Java來做的。我之前已經讀過一些「如果你有很大的開關語句你做錯了」的效果。希望我現在能找到一個參考。 – 2010-06-25 22:38:31

0

首先,在Smalltalk中,您已命名構造函數。事實上,類是對象,「構造函數」只是在類中定義的方法,它們恰好返回新實例。其他語言的工廠方法的許多用途可以用這種方式來涵蓋。

例如

Thing class >> withName: aString 
    ^dictionaryOfAllThings 
     at: aString 
     ifAbsentPut: (self new name: aString; yourself) 

它通過名字來取得的東西,只有當與該名稱的東西不存在創建一個新的東西。