스몰 토크에서 팩토리 메소드가 사용 되었습니까? 그렇다면 스몰 토크에서 사용되는 팩토리 메소드가 있습니까? 예를 들어, Java에서와 달리 스몰 토크를 작성하는 방법은 무엇입니까? 감사합니다. .공장 방법의 스몰 토크 상당?
답변
공장 패턴에서 이름을 지정하지 않고 일부 하위 클래스를 인스턴스화합니다. 피자 팩토리 및 계층 구조를 고려해보십시오.
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.
그리고 때마다 우리는 피자의 새로운 서브 클래스를 구현, 우리는 공장 매칭을 할 수있는 하나의 방법을 구현한다. 그냥 개체!
"이제 Java 또는 C++에서 서로 다른 문자열 이름을 비교하기 위해 큰 switch 문을 사용하게 될 것입니다."--- '일치하는'스몰 토크 예제는 자바 리플렉션 및 동적 클래스로드를 사용하는 것과 상당히 동일합니다. 나는 자바에서 모든 일을하지만 가장 사소한 일을한다. 나는 "당신이 OO를 잘못하고있는 큰 switch 문을 가지고 있다면"의 효과를보기 전에 몇 가지 것을 읽었습니다. 지금 참조를 찾을 수 있기를 바랍니다. –
먼저 Smalltalk에서 생성자의 이름을 지정했습니다. 사실, 클래스는 객체이고 "생성자"는 새로운 인스턴스를 반환하는 클래스에서 정의 된 메소드 일뿐입니다. 다른 언어의 팩토리 메소드를 많이 사용하는 방법도 있습니다. 이름으로 일을 얻을, 그 이름을 가진 것은 아직 존재하지 않는 경우에만 새로운 일을 만들어
Thing class >> withName: aString
^dictionaryOfAllThings
at: aString
ifAbsentPut: (self new name: aString; yourself)
예를
를 들어.
답변을 찾을 수 없지만 slideshare.net에서 [this] (http://www.slideshare.net/speludner/layers-of-smalltalk-application)에서 Factory에 대한 슬라이드를 찾았습니다. 도움이 될 수 있습니다. –