개요
싱글턴 패턴은 오직 한개만 존재하며 전역적으로 접근 가능한 클래스 인스턴스를 운용하는 패턴이다. 특정 클래스의 static 인스턴스와 그를 리턴해주는 static 메소드로 구현한다. 지역 static 변수의 초기화 시점이 최초 도달이라는 점을 이용해서 구현하기도한다.
싱글턴은 게으른 초기화, 런타임 초기화, 상속 가능, 유일 인스턴스 보장 및 전역 접근 이라는 특성을 가져 이들이 유용할 때 사용된다.
문제점
싱글턴은 남용해서는 안되는데 문제점이 몇가지 있기 때문이다.
전역 접근
전역 접근은 모든 코드에서의 접근을 허용한다는 이야기이기 때문에 생산성을 낮출 수 있다.
두개의 문제를 동시에 해결한다.
싱글턴은 유일 인스턴스와 전역 접근 두가지를 동시에 제공한다. 만약 둘 중 하나만 필요한 상황이라면 반대쪽이 강제되겡 적합하지 않다.
게으른 초기화
게으른 초기화는 장점이 될 수도 있지만 로딩타임에서 플레이타임으로 성능 요구가 넘어가기에 단점이 될 수도 있다. 싱글턴을 사전 초기화로 만들 수도 있지만 다형성을 살릴 수 없기에 그냥 기능들을 전역 메소드 등으로 구현하는게 낫다.
대안
필요없는 싱글턴 제거
특정 클래스를 A 관리하는 AManager클래스 등이 싱글턴으로 많이들 사용되는데 그러한 기능들을 객체지향 정신을 살려 각 A 인스턴스에서 스스로 처리하도록 A 클래스의 기능으로 옮기면 AManager라는 클래스가 필요 없을 수도 있다. 이렇게 불 필요한 싱글턴은 아예 제거할 수 있다.
유일 인스턴스 보장
유일 인스턴스의 보장만이 필요하다면 해당 클래스의 private static bool 멤버에 생성 여부를 넣고 생성자를 public으로 둔뒤 해당 멤버가 false일때만 생성가능하도록 한다. true일때는 assert를 발생시킨다. 생성되면 해당 멤버를 true로 하고 소멸시 false로 만든다. 이렇게 하면 생성자로 생성이 가능하지만 동시에 하나의 인스턴스만 존재 가능하다.
쉬운 접근 제공
상위 클래스에서 private static으로 특정 클래스의 인스턴스를 저장해두고 protected로 해당 객체를 받을수있는 메소드를 둔다면 해당 상위 클래스의 자식 클래스 인스턴스들은 해당 메서드로 저장된 인스턴스에 쉽게 접근할 수 있다. 상위 클래스의 static 멤버는 상위 클래스가 생성하거나 외부에서 생성된 것을 특정 시점에 받아두면 된다.
이미 있는 싱글턴에서 제공
싱글턴 클래스를 여러개 만들기보단 대표격의 하나의 싱글턴에서 나머지 클래스 인스턴스들을 제공해주는게 낫다.
서비스 중개자 패턴
이후에 배울 서비스 중개자 패턴이 대안책이 될 수 있다.
참고서적
게임 프로그래밍 패턴
'디자인 패턴 > 게임 프로그래밍 패턴' 카테고리의 다른 글
[게임 프로그래밍 패턴][8]이중 버퍼 (0) | 2024.04.26 |
---|---|
[게임 프로그래밍 패턴][7]상태 패턴 (0) | 2024.04.24 |
[게임 프로그래밍 패턴][5]프로토타입 패턴 (0) | 2024.04.22 |
[게임 프로그래밍 패턴][4]Observer 패턴 (0) | 2024.04.20 |
[게임 프로그래밍 패턴][3]경량 패턴 (0) | 2024.04.19 |