최근 면접에서 Multiton 패턴이라는 것에 대해 질문을 받았는데, 처음 들어보는 개념이라 간략하게 정리하려고 한다.
Multiton Pattern
은 객체를 생성하는 패턴 중 하나로, Singleton Pattern의 확장된 형태이다. Singleton Pattern은 클래스의 인스턴스를 하나만 생성하여 전역적인 접근을 제공하는 것이다. 반면, Multiton Pattern
은 클래스의 인스턴스를 여러 개 생성하여 각 인스턴스에 고유한 이름을 부여하는 방식이다.
일종의 key-value 와 같은 Map 형태로 이해할 수 있다. 각 객체 인스턴스는 특정한 key(이름)에 대응되며, 해당 key(이름)를 사용하여 인스턴스를 생성하거나 가져올 수 있다. 이렇게 생성된 객체 인스턴스들은 고유한 이름을 가지고 독립적으로 동작할 수 있다.
Multiton Pattern은 다중 스레드 환경에서 여러 개의 인스턴스가 동시에 생성되는 경우에도 안전하게 작동할 수 있다. 각 인스턴스는 고유한 이름을 가지므로 스레드 간의 충돌이나 Race Condition을 방지할 수 있다.
import java.util.HashMap;
import java.util.Map;
public class Multiton {
private static Map<String, Multiton> instances = new HashMap<>();
private Multiton() {
// private 생성자
}
public static synchronized Multiton getInstance(String name) {
Multiton instance = instances.get(name);
if (instance == null) {
instance = new Multiton();
instances.put(name, instance);
}
return instance;
}
}
Singleton과 달리 private 생성자를 가지고 있으며, getInstance() 메소드를 통해 인스턴스를 생성하거나 가져온다. 이때, getInstance() 메소드는 이미 생성된 인스턴스가 있다면 해당 인스턴스를 반환하고, 없다면 새로운 인스턴스를 생성하여 map에 추가한다.
[사용 예시]
Multiton instance1 = Multiton.getInstance("Instance 1");
Multiton instance2 = Multiton.getInstance("Instance 2");
// instance1과 instance2는 서로 다른 인스턴스입니다.