Multiton Pattern이란?
멀티톤 패턴은 클래스에 제한된 인스턴스(Instance) 집합을 확보하고 키(Key)를 기반으로 각각의 인스턴스에 액세스할 수 있는 지점을 제공하는 디자인 패턴입니다.
각 키는 단일 인스턴스에 매핑됩니다.
따라서 싱글톤처럼 인스턴스가 하나만 있는 대신 멀티톤은 각 키에 해당하는 인스턴스 수를 제어할 수 있습니다.
Multition 사용방법
멀티톤을 사용하는 경우는 주로 각 개별 키(Key)에 대해 클래스의 단일 인스턴스가 필요한 경우에 사용됩니다.(예를 들어, Database, UI 등)
이렇게 구성하면 고유한 목적이나 기능을 담당하는 여러 개의 "단일" Instance를 가질 수 있습니다.
public class ConfigurationManager
{
private static Dictionary<string, ConfigurationManager> _instances = new();
private ConfigurationManager() { }
public static ConfigurationManager GetInstance(string key)
{
if (!_instances.ContainsKey(key))
{
_instances[key] = new ConfigurationManager();
}
return _instances[key];
}
}
ConfigurationManager는 Dictionary를 이용해서 instance들을 저장합니다.
GetInstance static 함수를 이용해서 주이전 Key에 대한 instance가 딕셔너리에 존재하지 않는다면 딕셔너리에 추가되며, Key에 대한 instance가 딕셔너리에 존재할 경우 Key에 대응하는 instance를 return해줍니다.
class Program
{
static void Main(string[] args)
{
var dbConfig = ConfigurationManager.GetInstance("Database");
var uiConfig = ConfigurationManager.GetInstance("UI");
var anotherDbConfig = ConfigurationManager.GetInstance("Database");
bool areSame = ReferenceEquals(dbConfig, anotherDbConfig);
bool areConfigsSame = ReferenceEquals(dbConfig, uiConfig);
}
}
dbConfig에 경우 Database가 존재하지 않았으므로 ConfigurationManager의 딕셔너리에 저장합니다.
anotherDbConfig에 경우 Database가 존재하므로 ConfigurationManager의 딕셔너리에 존재했던 instance을 반환받습니다.
따라서, areSame의 경우 true가 됩니다.
areConfigsSame의 경우 서로 다른 instance이므로 false가 됩니다.
정리 및 요약
멀티톤 패턴은 Singleton 패턴의 변형입니다.
Singleton 패턴은 클래스가 하나의 인스턴스만 갖도록 하고 액세스할 수 있는 전역 지점을 제공하지만 Multiton은 주어진 각 키에 대해 클래스의 고유한 인스턴스를 보장하여 이 개념을 확장합니다.
멀티톤 패턴을 사용하는 이유는 다음과 같습니다.
- 특정성: 세분화된 제어가 가능하여 시스템의 개별 부분이 필요에 맞게 전용 인스턴스를 얻도록 합니다.
- 메모리 효율성: 멀티톤 패턴은 키당 하나의 인스턴스만 보장함으로써 메모리를 절약하는 데 도움이 될 수 있습니다.
- 중앙 관리: Multiton 패턴은 인스턴스 관리 및 액세스를 위한 중앙 지점을 제공하여 수명 주기 관리를 돕습니다.