2010-05-25 3 views
1

저는 Guice를 조사 중이며 최근에 해당 문서를 읽었습니다.초록 공장이나 공장 방법처럼 보이지 않으므로이 공장에 대해 혼란스러워합니다.

섹션 읽기 나는 공장 부품을 이해하지 못합니다. 왜 그런 식으로 이름을 붙입니까? 나에게 그 팩토리는 getInstance()를 호출 한 후 리턴 할 클래스를 구현하는 래퍼 일 뿐이다.

public class CreditCardProcessorFactory { 

    private static CreditCardProcessor instance; 

    public static void setInstance(CreditCardProcessor creditCardProcessor) { 
    instance = creditCardProcessor; 
    } 

    public static CreditCardProcessor getInstance() { 
    if (instance == null) { 
     throw new IllegalStateException("CreditCardProcessorFactory not initialized. " 
      + "Did you forget to call CreditCardProcessor.setInstance() ?"); 
    } 

    return instance; 
    } 
} 

추상 팩토리 또는 팩토리 메서드가 아닌 경우 (심지어 적어도 원래 GoF에서 정의한대로) 팩토리를 호출하는 이유는 무엇입니까? 또는 나는 무엇인가 놓치고 있냐?

감사합니다.

EDIT : 누군가가 더 나은 제목을 제시하면, 나는 그것을 바꿔 드리겠습니다.

답변

3

저는이 의사의 작성자입니다. DocumentBuilderFactory 및 TransformerFactory와 같은 JDK 클래스와의 일관성을위한 팩토리라고했습니다. setInstance()가 호출되지 않은 경우의 예 이전 버전은 기본 구현을 반환

public static CreditCardProcessor getInstance() { 
    if (instance == null) { 
     return new SquareCreditCardProcessor(); 
    } 
    return instance; 
    } 

나는 그 구현에 공장에서 컴파일 시간 의존성을 피하기 위해 그것을 변경되었습니다. JDK가 런타임에 구현을 선택하기 위해 사용하는 시스템 등록 정보보다 간단하기 때문에 클래스에는 setInstance()가 있습니다.

우리는 의존성 주입을 동기 부여하려고하기 때문에 원래 GoF 패턴에 불충실하다는 의미 일지라도 완전한 기능을 갖춘 팩토리를 표시하는 것이 불공정 해 보일 수 있습니다.

+0

음, Guice의 팩토리가 DocumentBuilderFactory와 어떻게 일관되는지 보지 못합니다. 예를 들어, 팩토리 메소드를 가지고 있지만 Guice의 케이스처럼 setInstance는 없다. DocumentBuilderFactory는 내가 생각하는 GoF의 패턴을보다 잘 준수하는 것으로 보입니다. 하지만 내 게시물이 내 질문에 가장 잘 맞다고 생각합니다. – Pin

+0

글쎄, 나는 Guice와 함께 일하는 누군가가 Guice가 공장이라고 부를 수있는 옛날로 돌아가서 생각하는 것을 볼 수있다. 제시, 어쨌든 싱글 톤 예제를 선택하는 이유는 무엇입니까? 그것은 단지 모든 사람을 혼란스럽게합니다. – nes1983

+0

나는 문서를 고쳤다. –

2

아마도 단순화 일뿐입니다. Java에는 다음과 같이 사용되는 팩토리 클래스가 많이 있습니다.

Foo newFoo = FooFactory.getInstance().makeFoo(); 

... 본질적으로 예제와 많이 동일합니다. 예, Guice 예제에서는 singletong 메서드의 메서드가 아닌 정적 메서드를 사용하지만 이미 singletons are little more than a very roundabout way of making static methods and fields을 알고 있습니다. 나는 그들이 나쁜 코드가 어떻게 생겼는지를 보여주기 위해 빠르게 뭔가를했다고 생각하며 GoF 패턴 캐논을 고수하는 것을 정말로 신경 쓰지 않았다.

+0

언급 한 팩토리 클래스에서 이전에 setInstance (FooImpl)를 호출해야합니까? Guice의 예에서 'creditCardProcessor'가 삽입되었습니다. – Pin

+0

지금 생각해 볼 수있는 유일한 클래스는'newInstance()'(글쎄, 거의 *'getInstance()';)가 무엇을 선택하는지 약간 더 진보 된 방법을 가진'DocumentBuilderFactory'입니다 : http : // /java.sun.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#newInstance%28%29 – gustafc

0

예하지만 인스턴스 생성 (private 생성자)에 대한 예방책이 전혀 없으며, 단독 패턴도 완전히 따르지 않습니다.

는 :

3

나는 코드가 자사의 상황에 따라 뭔가를 다른 클래스를 제공 할 수있는 유사한 패턴을 사용했습니다 ... 그것은 여기에 전체 코드하자. 예를 들어 CreditCardProcessor가 인터페이스 또는 추상 클래스 인 경우 상위 수준 코드는이를 만들고 사용하여 CreditCardProcessorFactory에 전달하여 사용할 구현을 설정하려고합니다. 사용하는 코드는 구현이 무엇인지 신경 쓰지 않고 CreditCardProcessor를 가져옵니다.

이것은 어떤 구현을 고려하지 않고 CreditCardProcessor를 얻고 있기 때문에 Factory 패턴과 유사합니다. 팩토리 메소드 (이 경우에는 잘못 명명 된 getInstance())에 인수를 전달하지 않고 있습니다. 구현은 다른 코드가 설정 한 것에 달려 있으며 사용자가 지정한 인수가 아닙니다. 나는이 경우에 내가 공장을 구현 한 클래스를 불렀을지도 모른다.

getInstance() 및 setInstance()는 사용자가 싱글 톤을 생각하기 때문에 나쁜 이름입니다. 나는 getCreditCardProcessor와 setCreditCardProcessor를 가지고 갔을 것이다.

관련 문제