2014-11-19 2 views
0

데이터베이스에서 검색 한 엄청난 양의 다른 종류의 객체를 다루는 프로젝트를 진행하고 있습니다. 추가 고려 사항에 대해서는 let's은 (단순 액세스 수정과 등이 omited 있습니다) 다음과 같이 우리가 훨씬 단순한 구조를 가지고 가정 : 중첩 된 구조의 디자인 문제

class Outer { 
    Mid mid; 
    string someString; 

    void createMid(string str) { 
     // some work 
     this.mid = new Mid(str); 
    } 
} 

class Mid { 
    Inner inner; 
    string someOtherString; 
} 

class Inner { 
    string innerString; 
} 

class Inner2 : Inner { 
    // some custom behaviour for innerString 
} 

이제 우리는 또한 중첩 된 객체를 인스턴스화 Outer의 인스턴스를 만듭니다. 이제 Inner -class 내에서 어떤 동작을 하위 클래스로 변경하려고합니다 ( innerString 속성을 기본 구현과 다른 값으로 설정한다고 가정 해 봅시다). 이에 대한 현재의 접근 방식은 서브 클래스 Inner입니다. 이 파생 클래스의 인스턴스를 만들려면 Mid 하위 클래스를 추가해야하므로 Outer 하위 클래스도 만듭니다. 이 중첩 된 구조를 생성하는 과정은 Outer 개체의 많은 작업으로 구성되지만 Inner2 -instance와 Mid의 인스턴스도 인스턴스화하기 위해 대부분의 코드를 재정의해야합니다.

거대한 디자인 결함처럼 들리지만 전체 구조를 서브 클래 싱하고이 상대적으로 작은 하위 오브젝트에 대해 전체 createMid- 방법을 오버라이드하는 것보다이 유형의 디자인에 대해 다른 해결책을 찾지는 않았습니다. Inner의 서브 클래 싱을위한 다른 접근 방법이 있습니까? 공장 패턴

+1

종속성 주입을 사용하면 모든 것을 상속 할 필요가 없습니다. 더 파생 된'Inner'를'Mid'에 대한 의존성으로 전달하면됩니다. –

답변

2

만들기 사용하는 대신 직접 Mid의 내부 Inner를 인스턴스화의 전화 :

this.mid = InnerFactory.Create(/*parameters*/); 

InnerFactory

다음 인수에 따라 Inner 또는 Inner2을 만들 수 있습니다.

팩토리가 인스턴스화 할 클래스를 결정할 수 있도록 매개 변수를 제공하는 것이 다소 까다로운 경우가 있습니다.

+0

저에게 적합합니다. – HimBromBeere

+0

잠시 후 모든 파생 된 유형에 대한 팩토리가 필요하므로 참여하는 클래스의 총량이 두 배로 증가한다는 것을 알았습니다. – HimBromBeere

+0

@HimBromBeere 'Outer' 클래스는 이미'createMid()'메소드를 가지고 있습니다. factory 클래스를 생성하는 대신 factory 메소드를 구현하는 모든 클래스에 대해'createXY()'메소드를 구현할 수 있습니다. – helb