2016-08-03 12 views
1

저는 자바의 초보자입니다. 배울 때 사용하는 책은 저를 완전히 혼란스럽게하는 수수한 예와 문장이있는 것 같습니다.Java 인터페이스 컨텍스트에서 "팩토리 메서드 디자인 패턴"?

현실적인 개념을 적용 할 인터페이스와 방법 및 위치를 이해합니다. 그러나 Factory Methods는 무엇입니까? "팩토리 메서드"라는 용어는 애매합니다 (JavaScript는 그 의미가 다릅니다). 그래서 제 질문을 명확히하기 위해 책의 스 니펫을 제공하고 있습니다.

interface Service { 
    void method1(); 
    void method2(); 
} 

interface ServiceFactory { 
    Service getService(); 
} 

Service 인터페이스는 단지 일반적인 인터페이스입니다 : 여기에 코드입니다. ServiceFactory 인터페이스는 일반 인터페이스처럼 보이지만 "팩토리 메소드"입니다. 그게 뭐야? 무엇이 해결되며 왜 사용해야합니까?

+0

엄밀히 말하면,'ServiceFactory' 역시 "일반적인"인터페이스입니다. 팩토리 메소드는 어떤 유형의 인스턴스 (따라서 "팩토리"라는 용어)를 생성 (생성)해야하므로 일종의 구현 (Java 8부터는 인터페이스의 기본 메소드가 될 수 있음)이 필요합니다. 인터페이스에서 factory 메소드를 지정할 수 있지만 특정 유형을 작성하는 concrete Factory 클래스가 필요합니다. https : //en.wikipedia를 참조하십시오.org/wiki/Factory_method_pattern –

+0

[Design Patterns : Factory 대 Factory Factory 대 Abstract Factory]의 가능한 복제본 (http://stackoverflow.com/questions/13029261/design-patterns-factory-vs-factory-method-vs-abstract- factory) – jaco0646

답변

0

"팩토리 메서드"는 개체를 만드는 메서드입니다.

보다 구체적으로이 용어는 일반적으로 선언 클래스 (직접 인스턴스 또는 하위 클래스 인스턴스)의 인스턴스를 반환하는 정적 메서드를 나타냅니다. 내 경험에 의하면, 즉 특히 일반적으로 끝났다 몇 가지 경우가있다 :

  • 당신은 팩토리 메소드를 사용하는 다른 생성자를 호출 만에 의해 구별 될 수있는 반면 당신이 (그들에게 적절한 이름을 부여 할 수 있습니다, 여러 다른 생성자를 가질 필요가있는 경우 인수 유형 (항상 한 번에 분명하지는 않음).
  • 엔트리 포인트 역할을하는 하나의 추상 클래스에 대해 여러 가지 구현이 필요하면 팩토리 메소드가 적절한 하위 유형을 인스턴스화 할 수 있습니다.
  • 어떤 종류의 캐싱 로직이나 공유 인스턴스가 필요한 경우, 팩토리 메소드가이를 처리하여 적절한 경우 기존 인스턴스를 리턴 할 수 있습니다.
  • 부작용이있는 작업을 수행해야하는 경우 해당 부작용이 무엇인지 명확하게 표시 할 수 있도록 팩터 리 메서드를 명명 할 수 있습니다.

예를 들어 실제로 "공장 방법"IMHO가 포함되어 있지는 않지만 조금만 속이고 getService()을 하나로 설명 할 수 있습니다. 그 대신에 ServiceFactory을 "factory"로 설명 할 것입니다. ServiceFactory.getService()의 이점은 의 정적 메소드 대신 인스턴스를 갖는 일반적인 이점과 동일한 것입니다.

+1

Static Factory Method는 GoF Factory Method Pattern과 같지 않습니다. 둘은 완전히 다릅니다. – jaco0646

+0

@ jaco0646 : 아, 네 말이 맞아. 그러나 OP의 예는 그 중 하나의 예가 아닙니다. – ruakh

+1

동의; _factory_라는 용어는 어떤 창조적 인 방법을 설명하기 위해 종종 매우 느슨하게 사용됩니다. 이 느슨한 용어는 GoF 나 다른 용어와 결합되어 혼동을 일으 킵니다. – jaco0646

1

팩토리 메서드는 단순히 개체 생성을 포함하는 메서드입니다. 대체로 Service 대신에 new 연산자를 사용하는 대신, 일부 개체에서 factory 메서드를 사용하고 있습니다.

ServiceFactory sf = new ServiceFactoryImpl(); 
// factory method 
Service s = sf.getService(); 

메서드의 역할을 더 잘 설명하기 위해 대신 createService이라고 할 수 있습니다. 이제 메서드는 Service의 생성에 대한 세부 정보를 캡슐화하고 오버로드로 메서드의 여러 가지 기능을 제공 할 수 있으며 컨텍스트에 따라 다른 하위 클래스를 반환하거나 팩터 리 메서드에 전달 된 매개 변수를 반환 할 수 있습니다.