멀티톤 패턴

Multiton pattern
UML diagram of the multiton
멀티톤의 UML 다이어그램

소프트웨어 엔지니어링에서 멀티톤 패턴싱글톤 패턴을 일반화하는 디자인 패턴이다.싱글톤은 한 클래스의 인스턴스 하나만 만들 수 있는 반면, 멀티톤 패턴은 여러 인스턴스의 제어된 생성을 허용하며, 이는 지도를 사용하여 관리한다.

애플리케이션당 단일 인스턴스(예:java.lang.RuntimeJava 프로그래밍 언어의 객체) 대신 멀티턴 패턴은 키당 하나의 인스턴스를 보장한다.

대부분의 사람들과 교과서들은 이것을 싱글톤 패턴으로[citation needed] 여긴다.예를 들어, 멀티톤은 높이 평가되는 객체 지향 프로그래밍 교과서 설계 패턴(단골격의 레지스트리로 명명된 보다 유연한 접근법으로 보인다)에 명시적으로 등장하지 않는다.

설명

멀티톤이 동시 접속이 가능한 해시 테이블인 것처럼 보일 수 있지만, 두 가지 중요한 구분이 있다.첫째, 멀티톤은 클라이언트가 매핑을 추가하는 것을 허용하지 않는다.둘째로, 멀티톤은 null이거나 빈 참조를 반환하지 않는다. 대신, 연결된 키를 가진 첫 번째 요청에 멀티톤 인스턴스를 생성하고 저장한다.동일한 키를 가진 후속 요청은 원래 인스턴스를 반환한다.해시 테이블은 실행 세부사항일 뿐 가능한 유일한 접근방법은 아니다.이 패턴은 응용프로그램에서 공유 객체의 검색을 단순화한다.

개체 풀은 한 번만 생성되므로(인스턴스 대신) 클래스와 연결된 구성원이기 때문에 멀티톤은 트리 구조로 진화하기보다는 평탄한 동작을 유지한다.

멀티톤은 풀의 각 멀티톤 인스턴스가 자체 상태를 가지고 존재할 수 있는 멀티톤의 단일 디렉토리(즉, 모든 키가 동일한 네임스페이스에 있음)에 대한 중앙 집중식 액세스를 제공한다는 점에서 독특하다.이러한 방식으로 패턴은 시스템에 필수적인 객체의 인덱스 스토리지를 옹호한다(예: LDAP 시스템에서 제공하는 것).그러나, 멀티톤은 무수한 분산형 시스템보다는 단일 시스템에서 광범위하게 사용하는 것으로 제한된다.

단점

이러한 패턴은 싱글톤 패턴과 마찬가지로 응용 프로그램에 글로벌 상태를 도입하기 때문에 유닛 테스트를 훨씬 더 어렵게 만든다.[1]

쓰레기가 수집된 언어와 함께, 그것은 물체에 대한 전세계적인 강력한 참조를 도입하기 때문에 메모리 누수의 원인이 될 수 있다.

구현

Java에서 멀티톤 패턴은 열거형 유형을 사용하여 구현될 수 있으며, 인스턴스에 해당하는 유형의 값을 사용할 수 있다.단일 값을 가진 열거형의 경우, 이것은 싱글톤 패턴을 제공한다.

C#에서는 다음 예에서 알 수 있듯이 에넘도 사용할 수 있다.

사용. 시스템; 사용. 시스템.수집포괄적인;  공중의 열거하다 멀티턴유형 {     ,     하나,     두 개 }  공중의 계급 멀티턴 {     사유의 정태의 읽기 전용 사전<멀티턴유형, 멀티턴> 예시 =         새로운 사전<멀티턴유형, 멀티턴>();      사유의 멀티턴유형 타자를 치다;      사유의 멀티턴(멀티턴유형 타자를 치다)     {         .타자를 치다 = 타자를 치다;     }      공중의 정태의 멀티턴 겟인스턴스(멀티턴유형 타자를 치다)     {         // 게으른 초기화(쓰기된 것처럼 안전한 스레드가 아님)         // 나사산 안전이 필요한 경우 이중 체크 잠금 사용 권장         만일 (!예시.TryGetValue(타자를 치다, 밖으로 시합을 하다 인스턴스))         {             인스턴스 = 새로운 멀티턴(타자를 치다);              예시.추가하다(타자를 치다, 인스턴스);         }          돌아오다 인스턴스;     }      공중의 무효로 하다 끈을 매다 토스트링()     {         돌아오다 "내 타입은 " + .타자를 치다;     }      // 샘플 사용량     공중의 정태의 공허하게 하다 메인()     {         시합을 하다 m0 = 멀티턴.겟인스턴스(멀티턴유형.);         시합을 하다 m1 = 멀티턴.겟인스턴스(멀티턴유형.하나);         시합을 하다 m2 = 멀티턴.겟인스턴스(멀티턴유형.두 개);          콘솔.WriteLine(m0);         콘솔.WriteLine(m1);         콘솔.WriteLine(m2);     } } 

참조

  1. ^ "Clean Code Talks - Global State and Singletons".

외부 링크