theory/디자인패턴

GoF의 디자인 패턴. 생성패턴 5. 싱글턴

아르르르를를르 2021. 9. 11. 20:28

- 지난 글에 이어 생성패턴을 다뤄본다.

추상 팩토리 (Abstract Factory)

빌더 (Builder)

팩토리 메서드 (Factory Methods)

프로토타입 (Prototype)

싱글턴 (Singleton)

 


싱글턴 (Singleton)

- 의도

단 한 개의 클래스 인스턴스를 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공한다.

 

- 동기

JDBC connection 관리하는 connection pool 등은 객체가 여러 개 생성되면 설정 값이 변경될 위험이 있다.

클래스 자신이 자기의 유일한 인스턴스로 접근하는 방법을 자체적으로 관리하도록 한다.

 

 

- 활용성

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

 

- 구조

 

- 참여자

  • Singleton: Instance() 연산을 정의하여, 유일한 인스턴스로 접근할 수 있도록 한다. 

 

- 결과

  1. 유일하게 존재하는 인스턴스로의 접근을 통제
  2. name space 공간을 줄임 (전역변수 사용 X, 디버깅 시간 줄임)
  3. 상속된 서브클래스를 통해서 새로운 인스턴스 생성 가능
  4. 인스턴스 개수를 변경하기 자유로움 (1개 이상의 인스턴스를 생성해야 할때, 접근 허용 범위를 결정하는 연산만 더하면 됨)
  5. 클래스 연산을 사용하는 것보다 훨씬 유연함 (Singleton을 사용하지 않을 때 사용 가능한 클래스 연산)

 

- 구현

  1. 인스턴스가 유일해야 함을 보장함
  2. SIngleton의 클래스를 서브 클래싱

 

- 예제

Singleton

- 생성자를 private로 지정하여 외부에서 절대로 생성할 수 없도록 한다.

- synchronized를 통해 여러 쓰레드에서 동시에 접근하는 것을 막는다.

public class Singleton {
    private static Singleton self = null;
    private Singleton() {}
    
    public synchronized static Singleton getInstance() {
        if(self == null) {
            self = new Singleton();
        }
        return self;
    }
    
    public void print() {
        System.out.println("I am only one.");
    }
}

 

public class Main {
    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
        s.print();
    }
}

 

- 참고 문헌

  • GoF의 디자인 패턴(개정판) / 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블라시디스 공저 / 김정아 역 / 프로텍미디어 / 발행 2015년 03월 26일