2014-11-15 4 views
2

추상 팩토리를 구현하고 싶습니다. 그러나 구체적인 팩토리는 싱글 톤으로 제공해야합니다.Java 추상 팩토리 및 싱글 톤

여기에 바나 스 씨의 사례가 있습니다 : http://www.newthinktank.com/2012/09/abstract-factory-design-pattern/ UFOEnemyShipFactory와 UFOBossEnemyShipFactory를 수정해야합니까?

나는 UFOEnemyShipFactory을 위해 뭔가를 시도했지만 나는 잘 될 모르겠어요 :

public class UFOEnemyShipFactory implements EnemyShipFactory{ 

    private UFOEnemyShipFactory(){}; 

    private static UFOEnemyShipFactory firstInstance = null; 

    public static UFOEnemyShipFactory getInstance(){ 

     if(firstInstance == null){ 

      synchronized(UFOEnemyShipFactory.class){ 

       if(firstInstance == null){ 

        firstInstance = new UFOEnemyShipFactory(); 

       } 

      } 

     } 

     return firstInstance; 

    } 

    public ESWeapon addESGun(){ 
     return new ESUFOGun(); 
    } 

    public ESEngine addESEingine() { 
     return new ESUFOEngine(); 
    } 

그것은 조금 이상한 것 같다, 내가 올바른 클래스에 필요한 수정을 적용하고 있지 않다 생각합니다. 내가 완전히 틀린 경우, 왜 내가 잘못하고 왜 수업을 수정해야하고 왜해야하는지에 대한 간단한 설명을 주시겠습니까?

미리 감사드립니다. 당신이 싱글 톤 디자인 패턴을 시도 할 때

+1

정말로 싱글 톤을 원한다면, 왜'enum'을 사용하지 않을까요? Java 언어는 모든 어려운 작업을 수행합니다. 물론 싱글 톤이 좋은지 많은 논란이있다. http://www.embeddedrelated.com/showarticle/691.php –

답변

0

내가 당신 AbstractFactory 문제에 관한 완전한 정보를 가지고 있지 않습니다 두려워 해요,하지만 난 당신의 싱글 문제에 당신을 도울 수 ...

보통 당신은 개인 생성자를 지정 다른 사람들은 기본 생성자를 사용하여 자체 인스턴스를 만들 수 없습니다.

추가 관찰로 고전적인 "이중 검사"방지 패턴 (사용하지 않을 것)으로 빠져 들었습니다. 여기에 더 자세히 설명했습니다 : What's wrong with the following getInstance() method 기본적으로 동기화 블록 외부를 확인하고 동기화 한 다음 다시 확인하지 마십시오. 안전하다고 생각되지만 그렇지 않습니다.

public static UFOEnemyShipFactory getInstance(){ 
    if(firstInstance == null){ 
     synchronized(UFOEnemyShipFactory.class){ 
      if(firstInstance == null){ 
       firstInstance = new UFOEnemyShipFactory(); 
      } 
     } 
    } 
    return firstInstance; 
} 

쓰기 중이 :이 들어

public static synchronized UFOEnemyShipFactory getInstance(){ 
    if(firstInstance == null){ 
       firstInstance = new UFOEnemyShipFactory(); 
    } 
    return firstInstance; 
} 

또는 많은 사람들이 더 나은 주장 : 또한

private static final UFOEnemyShipFactory firstInstance = new UFOEnemyShipFactory(); 

public static UFOEnemyShipFactory getInstance(){ 
    return firstInstance; 
} 

스타일 포인트. 이론 상으로는 원하는대로 이름을 붙일 수 있지만 "firstInstance"는 질문을합니다. "secondInstance"가 있습니까? 그러나 "인스턴스"(적어도 자바의 의미에서)는 일반적으로 "유일한 것"을 의미합니다. 더 나은 "인스턴스". 당신의 아이디어가 어딘가에 두 개의 싱글 톤을 매달아 놓는 것이지만 별개의 것이라면, 예를 들어 참조 페이지의 이름을 따라, ufoBossInstanceufoGruntInstance으로 이름을 붙일 수 있습니다.

+0

두 번째 코드 게시물은 무의미합니다. 당신은 하나의 null 체크 만 할 수 있습니다. 널 (적어도 이론적으로)를 두 번 확인하는 이유는 동기화 전에 수표 중 하나를 저렴하게 수행 할 수 있기 때문입니다. –

+0

@ Jason S. 그래, 고마워. 실수로 내 부분을 수정 ... 수정되었습니다. –