5

그래, 전략 및 팩토리 디자인 패턴을 모두 사용하도록 지정 받았어. 문제는 다음과 같습니다.팩토리를 전략 디자인 패턴과 함께 사용

대출을 처리하는 데 사용할 은행 용 응용 프로그램을 개발 중입니다. 메서드 capital()Loan 클래스가 있습니다. capital() 메소드에는 Loan 오브젝트 인스턴스 속성 중 일부를 검사하고 속성을 기반으로하는 대출 유형에 올바른 전략을 사용하는 추악한 if-then-else 조건이 있습니다. 우리는이 디자인에 전략 패턴을 소개하고 싶습니다

capital() { 
    if (expiry == null && maturity != null) { 
     // Find capital for term loan 
     return commitment * duration * riskFactor; 
    } 
    if (expiry != null && maturity == null) { 
     if (getUnusedPercentage() != 1.0) { 
      // Find capital for revolving loan 
      return commitment * unusedPercentage * duration * riskFactor; 
     } else { 
      // Find capital for complex loan 
      return (outstandingRiskAmount * duration * riskFactor) + (unusedRiskAmount * duration * unusedRiskFactor); 
     } 
    } 
} 

다음은 capital() 방법에 대한 사이비 - 코드입니다. 적절한 Strategy 객체를 생성하는 팩토리를 생성합니다. 팩토리를 싱글 톤 클래스로 만듭니다. UML 다이어그램을 그리고 capital() 메소드를 대체 할 코프 스 니펫을 작성하십시오. 전략 사용에 대한 핵심 사항 : 클라이언트는 컨텍스트 개체를 제공해야합니다.

좋아요, 그래서 UML 다이어그램을 작성했습니다. 나는 싱글 톤에 대한 나의 이해에 대해 꽤 견고하며, 그렇게 생각했다. 나는 전략을 꽤 잘 이해한다고 생각합니다. 그러나 나는 전략 객체를 만드는 공장에서 가지고있는 셋업이 이것에 관한 가장 좋은 방법이라고 확신하는 데 어려움을 겪고있다. Check out my diagram here. 나는 Loan을 컨텍스트 객체로 사용하여 (Loan 생성자를 통해 적절한 전략으로 공장에서 생성함으로써 그것을 초기화하는) 대출을 생성하는 클라이언트 객체를 작성할 계획이다. 그러면 capital() 메소드는 구성된 모든 전략을 실행합니다. 나의 이해가 정확하다면, 여기에 공장을 세우는 방법은 간접비의 계층을 추가하여 전략과 대출 (컨텍스트)을 완전히 분리시키는 역할을합니다.

내가 알고있는 한 가지 사실은 원래의 자본 방법에서 발생한 계산 중에 사용 된 데이터를 얻는 방법입니다. 일부 전략의 경우 몇 가지 매개 변수 만 사용됩니다 (기간 대출은 약정, 기간 및 riskFactor 만 사용되지만 복잡한 대출은 대출의 모든 사용 가능한 속성을 사용합니다). 모든 전략에 의해 구현 된 메서드는 6 가지 특성을 모두 매개 변수로 사용해야합니까?

더 나은 결과를 얻으려면 전략 패턴으로 팩토리를 사용하는 더 좋은 방법이 있습니까? 대신 AbstractFactory 또는 Factory Method를 사용해야합니까?

공장은 적절한 전략을 수립해야합니다

+0

그리고 문제가 될 것 ...? – Isaac

+0

과 관련 있음 : http://stackoverflow.com/questions/5375187/strategy-design-pattern-and-factory-method-design-pattern. 또한 : http : //www.codeproject.co.kr/Articles/9942/Refactoring-to-Patterns-Factory-and-Strategy-Patte 및 http://social.msdn.microsoft.com/Forums/is/architecturegeneral/thread/8218054d-969c-4066-ba05-24553f890465 –

답변

10

다음은이 질문에 대한 나의 해석과 내 대답이다. 대출의 속성에 대해 알고있는 경우에만이를 수행 할 수 있습니다. 그러므로 공장은 당신이 선호하는 어떠한 사출 방법을 통해 대출을 받아야하고, 대출의 속성을 사용하여 어느 전략을 돌려 줄지 결정해야합니다.

이제는 대출 유형에 적합한 전략이 있으므로 자본을 계산해야합니다. 다시 말하지만, 이것은 대출의 속성에 의존합니다. 따라서 전략에는 대출이 필요합니다. 이것은 팩토리의 생성자를 통해 또는 capital/calculateCapital 메소드의 매개 변수를 통해 주입 될 수 있습니다.

이렇게하면 멋지고 단순하며 느슨하게 결합되고 추상화됩니다. 같은

뭔가 :

ICapitalStrategy s = LoanStrategyFactory.Create(loan); 
s.CalculateCapital(loan); 
관련 문제