본문 바로가기

Pattern/GOF

생성패턴- 싱글톤

반응형

1. 싱글톤 패턴이란?

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 

설정 값과 같이 여러 클래스에서 접근 가능하며 공통된 값들을 공유할 때 많이 사용하는 방식이다.

 

2. 주의점

- 멀티쓰레드 안정성

싱글톤은 하나의 인스턴스를 공유하기 때문에 멀티쓰레드 환경에 유의하여 작성되어야 한다.

public class Settings
{
    private Settings()
    {

    }

    private Settings INSTANCE = null;
    
    public Settings getInstance()
    {
        if (INSTANCE == null)
            INSTANCE = new Settings();
        return INSTANCE;
    }
   
}

멀티쓰레드를 지원하는 프로그램에서 위와 같이 코딩 했을 경우 서로 다른 쓰레드에서 getInstance() 메소드를 호출 했을 때 분기점마다 INSTANCE를 중복 생성할 수 있다. 

- 늦은 초기화

public class Settings
{
    private Settings()
    {

    }
    final private static Settings SETTINGS = new Settings();
    public static Settings getInstance() {
        return SETTINGS;
    }
}

위 코드는 전역에서 인스턴스를 생성하기 때문에 멀티쓰레드 안정성에는 문제가 없다.

하지만 싱글톤 클래스가 많은 기능들을 담당하게 되어 인스턴스 생산 비용이 커졌을 때 클래스 사용 유무와는 상관없이 매번 큰 자원을 소비할 것이다.

따라서 런타임에 생성할 수 있도록 늦은 초기화를 해주는 것이 좋다.

 

3. 위 조건을 만족하는 코드

public class Settings
{
    private Settings()
    {

    }

    private static class SettingHolder
    {
        final private static Settings SETTINGS = new Settings();
    }

    public static Settings getInstance() {
        return SettingHolder.SETTINGS;
    }
}

 

싱글톤 클래스에 Holder 이너 클래스를 두어 사용하는 방식이다.

Settings 클래스에는 Holder 클래스의 변수가 없기 때문에 Settings 클래스 로딩 시 Holder 클래스를 초기화하지 않는다.

따라서 getInstance()를 호출했을 때 SETTINGS 정적 변수를 최초 한번만 생성되기 때문에 늦은 초기화와 멀티쓰레드 안정성을 보장 받을 수 있다.

 

  

 

반응형

'Pattern > GOF' 카테고리의 다른 글

행위패턴 - 책임 연쇄 패턴  (0) 2022.05.31
구조패턴 - 프록시  (0) 2022.05.26
구조패턴 - 데코레이션 패턴  (0) 2022.05.24
구조패턴 - 컴포짓패턴  (0) 2022.05.23
생성패턴 - 팩토리메서드  (0) 2022.05.11