유니티 Multiton

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은 주어진 각 에 대해 클래스의 고유한 인스턴스를 보장하여 이 개념을 확장합니다.
 

멀티톤 패턴을 사용하는 이유는 다음과 같습니다.

  1. 특정성: 세분화된 제어가 가능하여 시스템의 개별 부분이 필요에 맞게 전용 인스턴스를 얻도록 합니다.
  2. 메모리 효율성: 멀티톤 패턴은 키당 하나의 인스턴스만 보장함으로써 메모리를 절약하는 데 도움이 될 수 있습니다.
  3. 중앙 관리: Multiton 패턴은 인스턴스 관리 및 액세스를 위한 중앙 지점을 제공하여 수명 주기 관리를 돕습니다.