2017-12-10 24 views
0

다음과 같은 팩토리 메소드가 있습니다. 이 설계하는 더 좋은 방법은 동적 기반으로 인스턴스를 만들 수 있습니다, 그래서요약 생성자 인수가 다른 유형의 팩토리 또는 팩토리 메소드

public IPolicy CreatePolicy(Context context) 
{ 
    IPolicy policy = default(IPolicy); 
    ISettings settings = _settings.Get(context); 
    Policy policyType = (Policy) Enum.Parse(typeof(Policy), settings.Policy); 
    switch (policyType) 
    { 
     case Policy.Policy1: 
      policy = new Policy1(_policy1Service, _logHandler); 
      break; 
     case Policy.Policy2: 
      policy = new Policy2(_policy2Service, _logHandler); 
      break; 
     case Policy.Policy3: 
      policy = new Policy3(_policy1Service, _policy2Service, _logHandler); 
      break; 
    } 
    return policy; 
} 
+0

당신은'IPolicy'의 일반적인 방법을 만드는 것에 대해 생각해 보셨습니까 – MethodMan

+0

당신의 코드가 OCP를 존중한다고 주장 할 수 있습니다. 'CreatePolicy'는 닫힙니다 (새로운 정책을 추가하더라도 그것을 호출하는 클라이언트는 변경 될 필요가 없습니다)하지만 스위치의 숨겨진 정보에서 확장을 위해 열려 있습니다. OCP에 따르면 변종 보호 *가 있다고합니다. – Fuhrmanator

답변

0

이 열거 리터럴이 정확히 클래스 이름과 동일 세웠 switch 문을 사용하고 개방 폐쇄 원칙을 달성 할 필요가 없습니다 있는가

public static IPolicy CreatePolicy(Policy policy) 
{ 
    //Change this if the namespace of your classes differs 
    string ns = typeof(Policy).Namespace; 

    string typeName = ns + "." + policy.ToString(); 

    return (IPolicy)Activator.CreateInstance(Type.GetType(typeName)); 
} 

전달 생성자의 매개 변수와 같은 문자 열거, 단순히

return (IPolicy)Activator.CreateInstance(Type.GetType(typeName), 
    _policy1Service, _logHandler); 

이 매우 이례적인 때문에 처럼 추가하여도 가능 에 Initialize (...) 메서드를 추가하여 빈 매개 변수를 허용하도록 이러한 매개 변수를 전달하는 방법에 대해 생각해보십시오.