2010-01-07 5 views
3

동일한 결과를 얻기 위해 둘 이상의 알고리즘을 설계하는 경우가 있습니다. 예를 들어, 필자는 데이터를 나무에 저장하는 클래스와 링크 된리스트에 대략 동일한 데이터를 저장하는 또 다른 클래스를 작성했습니다.클래스/메소드의 다른 구현을 사용하기위한 디자인 패턴

ThingStore라는 인터페이스 (추상 클래스)를 게시하고 TreeThingStore 및 ListThingStore에 하위 클래스로 각각 트리 또는 링크 된 목록을 사용합니다.

그러나 추상 클래스를 게시 할 때 사용할 구현을 결정할 사람이 필요합니다 (EDIT : 발신자가이 문제를 신경 쓰지 않아도 됨). 하드 코드 된. 이 작업은 한 번 이상 필요했지만 GoF 및 기타 Design Patterns 카탈로그는 불완전하게 검토했습니다. 가장 유사한 패턴은 "전략"이지만, 다양한 목표를 달성합니다.

이 의도를위한 디자인 패턴이 있습니까? 그렇지 않다면, 누군가가 이것을 만들거나 이것이 왜해서는 안되는지 (동일한 결과를 얻는 더 좋은 방법)를 말해 줄 수 있습니까?

답변

3

그런 구현을 지정하는 것이 약간 이상합니다. 발신자가 특정 기능을 구현하는 방법에 신경을 쓰는 이유는 무엇입니까? 주의해야 할 것은 데이터 저장소가 데이터를 올바르게 저장하고 사용하는 기본 데이터 구조에 대해 실제로 염려하지 않는다는 것입니다. 그러나 구현이 데이터 저장소의 다른 기능으로 외부에서 표현되었다고 가정 해 봅시다 (하나는 많은 삽입에 적합하고 다른 하나는 많은 읽기에 더 적합합니다). 그런 다음 인스턴스화할 구체적인 클래스를 지정하는 것은 호출자의 몫입니다. 수업 설계자로서, 당신이 어떻게 든 가장 잘 압니다. :)

감안할 때 객체 생성을 Factory으로 바꿀 수 있으며 중요한 기능이있는 팩토리를 사용자가 공장에 지정할 수 있습니다. 호출자가 인스턴스화하고 사용할 저장소 메커니즘을 전달할 수 있도록 허용하는 곳을 더 멀리두고 Inversion of Control pattern을 사용할 수 있지만 그렇게하려는 것은 지나치게 복잡합니다.

+0

아마 나 자신을 분명히하지 않았습니다. 호출자는 구현 방법에 상관하지 않습니다.그것이 객체를 생성하기 위해 어떤 알고리즘을 사용해야하는지 정확히 이유는 무엇입니까? –

+0

하나의 구현은 기본이며 무료이며 다른 하나는 비용을 지불해야합니다. –

0

(찾으려는 내용에 따라) Factory Pattern 또는 Adapter Pattern을 확인하십시오. Adapter는 exitsting 구현을 래핑하는 데있어 더 많은 역할을합니다. factory는 하위 클래스 트리 또는 복합 클래스를 만드는 것입니다.

ThingStore theThingStore = ThingStoreFactory.GetStore("tree"); 
2

난 당신이 브리지 패턴을 확인하는 것이 좋습니다 : 그것과 유사한 디자인이 허용

공장은 아마 당신의 가장 가까운 패턴이다. 의도는 구현과 추상화를 분리하여 두 가지를 독립적으로 변경할 수 있도록하는 것입니다.

Java API의 collections 클래스 프레임 워크는 브리지 패턴 사용의 몇 가지 예를 제공합니다. ArrayList 및 LinkedList 구상 클래스는 모두 List 인터페이스를 구현합니다. List 인터페이스는 목록에 추가하고 크기를 묻는 기능과 같은 공통의 추상적 개념을 제공합니다. 구현 세부 사항은 ArrayList와 LinkedList에 따라 다르며 주로 목록의 요소에 메모리가 할당되는 시점과 관련됩니다. 클라이언트가 관심을 구체적인 구현을 취득하기 위해서 Bridge patternA를 공장를 사용

문제에 대한 적절한 접근 방법처럼 보인다.