출처: https://en.wikipedia.org/wiki/Multiton_pattern
Multiton 패턴
소프트웨어 엔지니어링에서 multiton 패턴은 singleton 패턴을 일반화한 디자인 패턴입니다. singleton은 생성될 클래스의 인스턴스를 하나만 허용하지만, multiton 패턴은 map의 사용을 통해 관리되는 여러개의 인스턴스 생성을 허용합니다.
응용프로그램(예시 java.lang.Runtime) 당 하나의 인스턴스를 가지는 것에 비해 multiton 패턴은 대신에 key 당 하나의 인스턴스를 보장합니다.
대부분의 사람과 교과서는 singleton 패턴을 고려합니다. 예를 들어 multiton은 객체지향 프로그래밍 교과서인 디자인 패턴에 자주 나타나지는 않습니다. (이는 더 유연한 접근인 singleton들의 레지스트리라는 이름으로 나타납니다.)
설명
multiton이 액세스가 동기화된 해시 테이블인 것처럼 보일 수 있지만 두 가지 중요한 차이점이 있습니다. 첫째, multiton은 클라이언트가 매핑을 추가하는 것을 허용하지 않습니다. 둘째, multiton은 null 또는 빈 참조를 반환하지 않습니다. 대신 연결된 키를 사용하여 첫 번째 요청에서 multiton 인스턴스를 만들고 저장합니다. 동일한 키를 가진 후속 요청은 원래 인스턴스를 반환합니다. 해시 테이블은 구현 세부 사항 일뿐 가능한 유일한 접근 방식은 아닙니다. 이 패턴은 애플리케이션에서 공유 객체 검색을 단순화합니다.
객체 풀은 인스턴스가 아닌 클래스와 연결된 멤버이므로 한 번만 생성되기 때문에 multiton은 트리 구조로 진화하는 대신 플랫 동작을 유지합니다.
multiton은 풀의 각 멀티 톤 인스턴스가 자체 상태를 가질 수 있는 multiton의 단일 디렉토리 (즉, 모든 키가 그 자체로 동일한 네임 스페이스에 있음)에 대한 중앙 집중식 액세스를 제공한다는 점에서 고유합니다. 이러한 방식으로 패턴은 시스템에 대한 필수 개체의 색인화된 저장소 (예 : LDAP 시스템에서 제공)를 옹호합니다. 그러나 multiton은 분산 시스템이 아닌 단일 시스템에서 광범위하게 사용되도록 제한됩니다.
단점
Singleton 패턴과 같은 이 패턴은 애플리케이션에 전역 상태를 도입하므로 단위 테스트를 훨씬 더 어렵게 만듭니다.
가비지 수집 언어를 사용하면 객체에 대한 전역적인 강력한 참조를 도입하므로 메모리 누수의 원인이 될 수 있습니다.
구현
Java에서는 인스턴스에 해당하는 유형의 값과 함께 열거 유형을 사용하여 multiton 패턴을 구현할 수 있습니다. 단일 값이 있는 열거 형의 경우 singleton 패턴을 제공합니다.
C#에서는 다음 예제와 같이 열거 형을 사용할 수도 있습니다.
using System.Collections.Generic;
public enum MultitonType {
Zero,
One,
Two
};
public class Multiton {
private static readonly IDictionary<MultitonType, Multiton> instances =
new Dictionary<MultitonType, Multiton>();
private int number;
private Multiton(int number) {
this.number = number;
}
public static Multiton getInstance(MultitonType type) {
// Lazy init (not thread safe as written)
// Recommend using Double Check Locking if needing thread safety
if (!instances.ContainsKey(type)) {
instances.Add(type, new Multiton((int)type));
}
return instances[type];
}
public override string toString() {
return "My number is " + number.ToString();
}
// Sample usage
public static void main(string[] args) {
Multiton m0 = Multiton.GetInstance(MultitonType.Zero);
Multiton m1 = Multiton.GetInstance(MultitonType.One);
Multiton m2 = Multiton.GetInstance(MultitonType.Two);
System.Console.WriteLine(m0);
System.Console.WriteLine(m1);
System.Console.WriteLine(m2);
}
}
'Java' 카테고리의 다른 글
어떻게 자바의 'for each' 루프가 작동하나요? (0) | 2021.04.05 |
---|---|
명령어 라인에서 JUnit test case를 실행하는 방법 (0) | 2021.02.26 |
Gradle - Could not target platform: 'Java SE 8' using tool chain: 'JDK 7 (1.7)' (0) | 2020.08.10 |
JNA로 Java에서 C++ 클래스 호출하기 (0) | 2020.03.16 |
파이프 글자로 문자열 분리하기("|") (0) | 2020.03.03 |