2010-06-25 5 views
4

스몰 토크에서 팩토리 메소드가 사용 되었습니까? 그렇다면 스몰 토크에서 사용되는 팩토리 메소드가 있습니까? 예를 들어, Java에서와 달리 스몰 토크를 작성하는 방법은 무엇입니까? 감사합니다. .공장 방법의 스몰 토크 상당?

+0

답변을 찾을 수 없지만 slideshare.net에서 [this] (http://www.slideshare.net/speludner/layers-of-smalltalk-application)에서 Factory에 대한 슬라이드를 찾았습니다. 도움이 될 수 있습니다. –

답변

11

공장 패턴에서 이름을 지정하지 않고 일부 하위 클래스를 인스턴스화합니다. 피자 팩토리 및 계층 구조를 고려해보십시오.

Pizza 
    PepperoniPizza 
    CheesePizza 
    ... 

피자 하위 클래스의 클래스 이름을 모른 채 인스턴스화하고 싶습니다. 예를 들어 :

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

는 채워 그것의 크기, 피자의 오른쪽 서브 클래스에 응답

자바에서 지금

또는 C++ 하나 아마 다른 문자열의 이름을 비교하는 큰 '스위치'문을 할 것입니다.. 우리가 피자의 새로운 하위 클래스를 추가 할 때마다 master switch 문에 추가해야한다는 것을 기억해야합니다. 일반적인 예는 Wikipedia article을 참조하십시오.

클래스가 첫 번째 클래스 객체 인 스몰 토크가 아니기 때문에 각 하위 클래스가 일치하도록 요청하여 클래스 계층을 반복 할 수 있습니다. 예를 들면 다음과 같습니다 유지하기

CheesePizza class>>matching: aString 
    ^aString = 'cheese' 
PepperoniPizza class>>matching: aString 
    ^aString = 'pepperoni' 

없음 중앙 switch 문 :

Pizza class>>flavor: aString size: anInteger 
    matchingClass := self subclasses detect: [:first | first matching: aString]. 
    ^matchingClass new size: anInteger. 

그리고 때마다 우리는 피자의 새로운 서브 클래스를 구현, 우리는 공장 매칭을 할 수있는 하나의 방법을 구현한다. 그냥 개체!

+0

"이제 Java 또는 C++에서 서로 다른 문자열 이름을 비교하기 위해 큰 switch 문을 사용하게 될 것입니다."--- '일치하는'스몰 토크 예제는 자바 리플렉션 및 동적 클래스로드를 사용하는 것과 상당히 동일합니다. 나는 자바에서 모든 일을하지만 가장 사소한 일을한다. 나는 "당신이 OO를 잘못하고있는 큰 switch 문을 가지고 있다면"의 효과를보기 전에 몇 가지 것을 읽었습니다. 지금 참조를 찾을 수 있기를 바랍니다. –

0

먼저 Smalltalk에서 생성자의 이름을 지정했습니다. 사실, 클래스는 객체이고 "생성자"는 새로운 인스턴스를 반환하는 클래스에서 정의 된 메소드 일뿐입니다. 다른 언어의 팩토리 메소드를 많이 사용하는 방법도 있습니다. 이름으로 일을 얻을, 그 이름을 가진 것은 아직 존재하지 않는 경우에만 새로운 일을 만들어

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

예를

를 들어

.