2016-10-18 6 views
0

내가하려고하는 것을 설명하는 가장 좋은 방법은 코드에있는 것일 수 있습니다. 자바 일반 공장 구현

Public class Product 
Public class Vendor<T extends Product> 

지금 나는 당신에게 문자열 입력 PARAM 나는이 일반적인 공장을 만들 수있을 것 어떻게

Public Factory { 
     public Vendor getInstance(String Type){ 
      Class cls = Class.forName(Type); 
      return new Vendor<cls>(); 
     } 
    } 

에 따라 공급 업체를 줄 것이다 일반적인 공장을 만들려고하고 있어요?

+5

당신이 아니라 유형 안전한 방법으로 할 수 있습니다. –

+0

이 작업을 수행하는 종속성 삽입 프레임 워크를 얻는 것에 대해 강하게 생각해야하며, 다시 말하면 String 매개 변수를 기반으로하지 않습니다. –

답변

1

수신 한 매개 변수를 기반으로 공급 업체를 만들고자한다면 문자열 대신 Class을 사용해야합니다. T extends Product 유형을 받기 위해 메소드를 매개 변수화 할 수도 있습니다.

public class Main { 

    static class Product {} 
    static class SubProd extends Product {} 
    static class Vendor<T extends Product> {} 

    public static <T extends Product> Vendor<T> getInstance(Class<T> clazz) { 
     return new Vendor<T>(); 
    } 

    public static void main(String[] args) { 
     Vendor<SubProd> v = Main.getInstance(Main.SubProd.class); 
     System.out.println(v); 
    } 
} 

클래스 매개 변수는 직접 사용되지 않지만 반환 된 공급 업체의 유형을 적용하는 데 사용됩니다. 이 코드는 경고, 예외 또는 캐스트없이 컴파일되고 실행됩니다. 문자열을 사용하는 동안 발생할 수있는 모든 예외를 처리해야하며 여기 저기에 추악한 캐스트를 작성해야합니다.

제네릭은 매우 강력합니다.이 작은 예제는 그 (것)들로 할 수있는 것의 조금을 보여줍니다. 그러나 때로는 문제를 해결할 더 간단하고 우아한 방법이 있다는 것을 알아 두십시오.

+1

_factory_의 목적은 제품 클래스의 구체적인 인스턴스를 만드는 것입니다. 나는 _generic_ 공장이 어떤 용도로든 사용되는 것을 정말로 의심합니다. 어떻게 든 공장은 주어진 매개 변수에 따라 어떤 구체적인 제품 클래스를 인스턴스화할지 결정해야합니다. _generic_ 팩토리를 가지고 있다는 것은이 로직을 다른 곳에서해야한다는 것을 의미합니다. 즉, 팩토리의 _responsibility_가 다른 곳으로 이동하여 일반 팩토리를 쓸모 없게 만듭니다. –

0

컴파일러가 컴파일 과정에서 내부적으로 제네릭 형식 정보를 사용하기 때문에 그렇게 할 수 없습니다.

당신은 당신의 공장 제네릭 클래스 유형을 보낼 수 있습니다

public class Factory { 
     public <PRODUCT extends Product> Vendor<PRODUCT> getInstance(Class<PRODUCT> productClazz){ 
      return new Vendor<PRODUCT>(); 
     } 
    }