Smalltalk中是否使用了工廠方法,如果是的話,那麼應該如何編寫一個,而不是它們在Java中的方式? 謝謝。Smalltalk相當於一種工廠方法?
回答
在一個工廠模式中,我們實例化了一些沒有命名的子類。考慮一個比薩工廠和等級:
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'
沒有中央的開關語句來維護。只是物件!
「現在在Java或C++中,可能會做一個大型的」switch「語句來比較不同的字符串名稱」---您的Smalltalk示例與「匹配」相當於使用Java反射和動態類加載,這就是除了工廠最微不足道的情況之外,我都是用Java來做的。我之前已經讀過一些「如果你有很大的開關語句你做錯了」的效果。希望我現在能找到一個參考。 – 2010-06-25 22:38:31
首先,在Smalltalk中,您已命名構造函數。事實上,類是對象,「構造函數」只是在類中定義的方法,它們恰好返回新實例。其他語言的工廠方法的許多用途可以用這種方式來涵蓋。
例如
Thing class >> withName: aString
^dictionaryOfAllThings
at: aString
ifAbsentPut: (self new name: aString; yourself)
它通過名字來取得的東西,只有當與該名稱的東西不存在創建一個新的東西。
- 1. 工廠方法VS工廠對象
- 2. 靜態工廠方法vs工廠
- 3. 工廠模式 - 一種方法,分配給對象
- 4. 這仍然是一種工廠方法嗎?
- 5. 使用一種通用工廠方法創建實例
- 6. Java工廠方法
- 7. 在工廠方法
- 8. 相當於Java Convert.FromBase64String方法
- 9. ,相當於date(String)方法?
- 10. 從子類工廠方法PHP調用超類工廠方法
- 11. 抽象工廠和工廠方法可以一起使用嗎?
- 12. 當方法依賴於另一種方法
- 13. 當把工廠()方法進factoried對象,並把當工廠()方法來分離類?
- 14. 創建一個從靜態工廠方法工廠,然後調用靜態工廠方法上的ID
- 15. INIT]作爲一個工廠方法
- 16. php webserver相當於雜種?
- 17. 片段和工廠方法
- 18. AutoMapper靜態工廠方法
- 19. 抽象類工廠方法
- 20. 使用工廠方法
- 21. 靜態工廠方法(Spring)
- 22. 調用工廠方法
- 23. Java工廠方法緩存
- 24. 靜態工廠方法
- 25. AngularJS工廠 - 從方法
- 26. 工廠方法實施
- 27. Spring註解工廠方法
- 28. 靜態工廠方法
- 29. Angularjs工廠方法實現
- 30. 代碼工廠方法
我還沒有找到答案,但在slideshare.net上找到[this](http://www.slideshare.net/speludner/layers-of-smalltalk-application)以及一些關於Factory的幻燈片,可能會有所幫助。 – 2010-06-25 20:22:49