2012-07-30 11 views
1

싱글은 다음과 같습니다 :내가 코드를 작성했습니다 인스턴스화

public class SiteMapFactory { 

    public static ISiteMap getSiteMap(Locale loc) { 
     ISiteMap returnMap = null; 

     if (loc.equals(Locale.US)) { 
      returnMap = SiteMap_en_US.getInstance(); 
     } 
     if(loc.equals(new Locale("es","US"))){ 
      returnMap = SiteMap_en_US.getInstance(); 
     } 
     if(loc.equals(Locale.CANADA)){ 
      returnMap = SiteMap_fr_CA.getInstance(); 
     } 
     return returnMap; 
    } 
} 

나는 우리의 웹 사이트 모두 ko 페이지 (영어) 및 es_US (스페인어)에 대해 동일한 사이트 맵을 반환합니다. 그래서 저는 스페인어와 영어 버전 (타사 공급 업체가 영어 페이지를 스페인어로 변환 함)에 대한 미국 사이트 맵을 인스턴스화합니다. 사이트 맵을 인스턴스화하는 방법은 싱글 톤을 사용합니다. 싱글 톤 객체는 다음과 같이 생성됩니다 :

public class SiteMap_en_US extends SiteMapTree { 
    private static SiteMap_en_US m_instance; 

    private SiteMap_en_US() {} 

    static { 
     m_instance = new SiteMap_en_US(); 
     m_instance.init(); 
    } 

    public static SiteMap_en_US getInstance(){ 
     return m_instance; 
    } 

    @Override 
    protected void init() { 
     //some code 
    } 
} 

제 질문은 : 동일한 싱글 톤 객체를 두 번 재사용 할 수 있습니까? 그것은 싱글 톤 객체를 인스턴스화하는 유효한 방법입니까?

+1

두 개의 인스턴스를 만들지 않고 두 인스턴스 모두 동일한 인스턴스를 반환합니다. 따라서 한 로케일에서 변경 한 사항은 다른 로케일에서 사용되는 오브젝트에 반영되어 문제가 될 수 있습니다. – JProgrammer

+0

그게 우리가 원하는거야. 우리는 영어 템플릿 만 만들었습니다. 그러나 타사 공급 업체가 스페인어 번역을 수행하고 있으며 해당 템플릿을 코드 기반에 배포하지 않았습니다. 나는 스페인어 사이트 (나는 URL을 기반으로하고있다)를 탐지하고 스페인어에 대한 특정 사항을 차단하는 작업이 주어졌다. if/Else 로직을 기반으로 쉽게 할 수 있습니다. – pushya

답변

1

예,이 같은 단일 개체를 재사용 할 수 있습니다.

그러나 이렇게하면 어떤 언어를 사용하고 있는지 판단하기 위해 개체 내에 특수 처리를 포함 할 필요가 없으며 항상 동일한 방식으로 동작해야합니다.

다르게 행동해야하는 경우 SiteMap_en_US에서 파생 된 SiteMap_en_US (SiteMap_es_US)의 하위 클래스를 만드는 것이 좋으며 적은 수의 동작을 재정의 할 수 있습니다.

개체 내에서 모든 종류의 로캘 검사를 수행하여 동작을 결정할 수는 있지만 유지 관리가 쉬운 다른 방법을 고려하는 것이 좋습니다.

0

이것이 많은 사람들이 싱글 톤이 안티 패턴이라는 데 동의하는 이유입니다. 각 로케일마다 하나씩, 오브젝트의 여러 인스턴스가 필요합니다. 그것은 싱글 톤이 아닙니다. 저는 싱글 톤이 글로벌 변수에 대한 완곡 어법이라고 말하고 싶습니다. 기본적으로 글로벌 방식으로 로케일에 액세스 할 수 있습니다.

Singleton - The anti pattern

+0

"개체의 인스턴스가 2 개 필요합니다."라고 말하면 무슨 뜻인지 설명해주십시오. 제공된 코드는 하나의 인스턴스 만 만듭니다. – Wug

+0

@Wug : 스페인어와 영어 버전 모두에 동일한 인스턴스를 다시 사용하고 싶습니다. 위와 같이 코딩하여 할 수 있는지 알고 싶습니다. – pushya

+0

@Wug OP에 각 로케일에 대한 인스턴스가 있음을 의미합니다. 별도의 클래스 일 수 있으므로 각 클래스의 단일 인스턴스 만 가질 수 있습니다. 그러나 나에게 그것은 여전히 ​​많은 글로벌'SiteMapTree' (싱글 톤을 통해 접근 가능)를 만들고 있습니다. –

0

class SiteMapUS을 만들고 확장하여 두 개의 서브 클래스 SiteMapUSEnglishSiteMapUSSpanish을 만들 수 있습니다.

public class SiteMapUS{ 
    protected SiteMapUS(){ 

    } 
} 

public class SiteMapUSEnglish{ 

    protected SiteMapUSEnglish(){ 

    } 

    public SiteMapUSEnglish getInstance(){ 
     //return instance 
    } 

} 


public class SiteMapUSSpanish{ 

    protected SiteMapUSSpanish(){ 

    } 

    public SiteMapUSSpanish getInstance(){ 
     //return instance 
    } 

} 

모든 클래스는 별도 패키지로 배치하십시오.

이것은 목표를 달성하는 가장 간단한 방법입니다. 이 방법을 사용하면 다른 코드를 수정하지 않고도 로캘 관련 변경 사항을 쉽게 수정/추가 할 수 있다는 이점이 있습니다.

관련 문제