2016-06-09 4 views
0

현재 클래스 과제를 완료 중이며 질문 중 하나가 나에게 주어진 샘플 코드 일부를 재구성하기를 원합니다.팩토리 메서드 패턴에 대해 무효 반환

지나치게 정밀하지 않으면서도 여러 가지 하위 클래스가있는 추상 클래스가 있으며 각각의 다른 하위 클래스에는 해당 하위 클래스의 종류에 따라 무기가 할당됩니다.

if (this.getClass().getSimpleName().equals("FighterJet")) { 
    this.weapon = new GuidedMissileSystem(); 
    System.out.println("FighterJet " + id + " equipped with " + weapon.getClass().getSimpleName()); 
} 
else if (this.getClass().getSimpleName().equals("AttackHelicopter")) { 
    this.weapon = new GrenadeLauncher(); 
    System.out.println("AttackHelicopter " + id + " equipped with " + weapon.getClass().getSimpleName()); 
... 

그러면 콘솔에 하위 클래스와 무기의 이름이있는 문자열이 인쇄됩니다.

추상 추상 클래스에는 일련의 if 문이있어 어떤 하위 클래스인지 확인하고 적절한 무기를 할당하고 적절한 문자열을 인쇄합니다.

그들은 디자인 패턴을보고 제안했지만 'factory method'를 선택했습니다. 서브 클래스의 이름을 가진 문자열을 인쇄했기 때문에이 메소드에서 아무것도 반환하지 않기로 결정했습니다. 이 구문을 통한 무기 :

this.weapon = //whatever weapon 

및 무효 반환.

이것은 여전히 ​​공장 방법으로 간주됩니까? 나는 그렇지 않다고 생각한다.

감사합니다.

+1

일반 설명 : 문자열 비교를 통해 'this instanceof FighterJet' 또는'getClass(). equals (FighterJet.class) '를 선호합니다. 정확하고 덜 복잡합니다. –

+0

Noted, thanks :) –

답변

1

네가 맞다. 이것은 공장 출근 방법이 아니다. 팩토리 메서드는 주로 클래스의 새 인스턴스를 만들고 반환하며 초기화, 로깅 또는 기타 사소한 작업을 추가로 수행합니다.

예제에서 모든 객체는 단순한 생성자를 갖기 때문에 팩토리가 필요하지 않습니다. 당신이 정말로 팩토리 메소드를 작성하려는 경우, 그것은 일반적으로 다음과 같이 보일 것이다 :

보시다시피
public static GuidedMissileSystem createGuidedMissileSystem() { 
    return new GuidedMissileSystem(); 
} 

, 이것은 단순한 클래스에 대한 혜택이 없습니다. 무기의 범위, 탄환 및 기타 많은 세부 사항을 구성해야한다면 더 유용 할 것입니다.

코드를 살펴보면 하위 클래스에만 해당하는 동작을 하위 클래스로 옮기는 것이 좋습니다. 예를 들어, 수퍼 클래스에 추상 메소드 createWeapon()을 추가하고 서브 클래스가 적절한 무기를 선택하게 할 수 있습니다.