2010-11-29 4 views
3

안녕하십니까,상위 클래스가 하위 클래스를 참조해야합니까?

나는 약간의 레거시 코드를 직장에서 상속 받았으며 다소 특이한 디자인 패턴을 사용하고 있습니다. 유사한 패턴으로 포럼에서 찾을 수있는 유일한 참조는 here입니다. 상황은 원래 디자이너가 자식 클래스를 직접 참조하는 정적 팩터 리 메서드가있는 일반 부모 클래스 (추상이 아님)가 있다는 것입니다.

public static LoggerFactory getLoggerFactory(LogType type) { 
    switch (type) { 
    case LOG4J: 
     return Log4JLoggerFactory.getInstance(); 
    case LOGBACK: 
     return LogBackLoggerFactory.getInstance(); 
    default: 
     throw new RuntimeException("No logger factory defined for type " + type); 
    } 
} 

Log4JLoggerFactory 및 LogBackLoggerFactory이 LoggerFactory을 확장 : 여기

는 레거시 코드의 여러 곳에서 발견 코딩의 스타일의 샘플입니다.

이것은 내게는 정말 외견 상인데, 코드를 상당히 재 작성하기 전에이 디자인 패턴에 어떤 목적이나 이점이 있습니까? (공식적인 이름이 있습니까?)

어떤 생각이나 조언을 주시면 감사하겠습니다. 감사!

편집 : Yishai의 응답을 읽은 후 쉽게 참조 할 수 있도록 Wikipedia article on the Strategy pattern에 대한 링크가 포함될 것이라고 생각했습니다. 귀하의 답변에 감사드립니다!

답변

11

이것은 Java에서 매우 표준적인 패턴이며 전략 패턴을 구현하는 일반적인 방법입니다. 항상 표준 API에서 볼 수 있습니다 (Calendar vs. GregorianCalendar, NumberFormat vs. DecimalFormat 이상).

그렇다고 Dependency Injection이 모두 분노하고있는 상황에서 이러한 패턴은 실제로 Factory 인터페이스가있는 전용 Factory 클래스로 대체 될 수 있지만 더 큰 설계 이유가없는 경우에는 완벽하게 합리적인 디자인 선택입니다.

0

어쩌면 그들은 하나의 환경에서 Log4J를 사용하고 다른 환경에서 Logback을 사용하도록 설정할 수 있습니까? 때로는 개발자가 지역 개발을 할 때 도구를 선호한다는 것을 알고 있습니다. 그러나 배포 할 때가되면 회사가 보증/승인 한 바를 사용해야합니다.

4

Factory Method이라고하는 것이 좋습니다.

몇 가지 구체적인 구현을 반환하지만 공용 인터페이스 또는 기본 클래스를 통해 숨길 수 있다는 이점이 있습니다. 따라서 클라이언트는 구현 세부 사항에 신경 쓰지 않지만 가장 기본적인 클래스로 작동합니다.

0

이것이 좋은지 나쁜지는 상황에 따라 다릅니다. 예를 들어, '부모'가 모든 어린이를 만드는 방법을 알고있을 때, 그것은 좋은 습관 일 수 있습니다. 부모가 그것을 모를 때,이 해결책은 단지 문제를 일으킬 것입니다.

또 다른 문제는 테스트 가능성입니다. 부모에게 많은 자식이있는 경우, 자식과 별도로 부모를 만드는 것이 어려울 수 있지만 다시 다릅니다.

관련 문제