z 단일체(Singleton) :: C++, 그래픽 기술 블로그

1. 용도

오직 한 개의 클래스 객체만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다.


2.  활용성

  • 클래스의 객체가 오직 하나임을 보장받고, 잘 정의된 접근점으로 모든 사용자가 접근할 수 있도록 해야하는 경우
  • 유일한 객체가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정없이 확장된 서브클래스의 객체를 사용할 수 있어야하는 경우

3. Class Diagram과 구조

[Singleton] - Instance() 연산을 정의하여, 유일한 객체로 접근할 수 있도록 합니다. 이때 Instance() 연산은 정적 멤버 함수로 유일한 객체를 생성하는 책임을 맡습니다.

 

사용자는 Singleton 클래스에 정의된 Instance() 연산을 통해 유일하게 생성 가능한 객체에 접근합니다.


4. 장단점

장점

  • 유일하게 존재하는 객체로의 접근 통제 - Singleton 클래스 자체가 객체를 캡슐화하기에 접근이 제어가능합니다.
  • namespace를 좁힘 - 전역 변수를 사용해서 namespace를 더럽혀 디버깅의 어려움 등의 문제를 줄여줍니다.
  • 연산 및 표현의 정제 허용 - Singleton 클래스는 상속 가능하여, 자식 클래스로의 확장이 가능합니다.
  • 객체의 개수 변경이 자유로움 - 생성 가능한 객체 수를 객체에 접근할 수 있는 허용 범위를 결정하는 연산을 바꿈으로서 손쉽게 제어 가능합니다. 
  • 클래스 연산보다 유연함 - C++에서 클래스 연산은 정적 멤버 함수에 해당을 하는데, 이는 가상 함수가 아니라 가상 함수로 받을 수 없으며, 객체의 수를 늘린 경우에 대처하기가 어려워집니다.

5. 구현 방법

  1. 인스턴스가 유일성의 보장 - 정적 멤버 함수로 클래스를 만들고 이에 대한 체크를 하여 하나만 존재하도록 만듭니다. 이때 singleton의 static 변수로 singleton을 저장할 공간을 만들고, 이를 static 함수로서 접근 가능하도록 만듭니다. 이를 전역변수로 하는 경우에는 유일한 인스턴스가 만들어진다는 보장이 없어지며, 도중에 값을 변경하기 어려우며, 전역 객체에 대한 생성자 호출에 대한 명확한 순서가 정의되어 있지 않아 오류가 생길 수 있습니다.
  2. Singleton 클래스를 서브클래싱 - 단일체에 대한 레지스트리를 활용하여 이름에 맞는 단일체를 검색 및 반환시켜주는 형태로 구성해 나갑니다.

'C++공부 > GoF의 디자인 패턴' 카테고리의 다른 글

명령(COMMAND)  (0) 2022.06.01
책임 연쇄(Chain of Responsibility)  (0) 2022.06.01
원형(Prototype)  (0) 2022.05.18
팩토리 메서드(Factory Method)  (0) 2022.05.18
빌더(Builder)  (0) 2022.05.18

+ Recent posts