[디자인 패턴] 싱글톤 패턴

[디자인 패턴] 싱글톤 패턴

싱글톤 패턴(Singletone Pattern)

정의 : 유일한 객체를 만들기 위한 코드 패턴

장점 : 인스턴스를 추가로 생성하지 않고, 기존에 생성된 인스턴스를 재사용하기 때문에 리소스를 절약할 수 있다.

단점 : 대표적인 객체 지향의 안티 패턴,

  1. 싱글톤 객체에 여러 모듈이 의존하면서 결합도 상승 (OCP 위배)

  2. 싱글톤 객체가 지는 책임이 많음 (SRP 위배)

  3. 모듈들이 인터페이스가 아니라 구체적인 객체에 의존하게 만듦 (DIP 위배)

단, 스프링 프레임워크를 사용하면 Ioc(Inversion Of Control)를 통해 일반 객체도 싱글톤 객체처럼 쓸 수 있게 함으로 싱글톤의 단점을 상쇄할 수 있다.

구현

  1. Bill Pugh Solution (LazyHolder) -> : 필요할 때 로드되어 성능이 좋음 : 클라이언트가 임의로 싱글톤 파괴 가능

class Singleton {

    private Singleton() {}

    // static 중첩 클래스 사용
    // Holder를 통해 클래스 로드 시점을 getInstance의 메소드 호출 시점으로 미룸(Lazy)
    // 유일한 객체 생성을 위해 생성자 private
    private static class SingleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingleInstanceHolder.INSTANCE;
    }
}
  1. Enum -> : 클라이언트가 임의로 싱글톤 파괴 불가능 : 멀티톤으로 전환 시 코드를 다시 작성해야 함

enum SingletonEnum {
    INSTANCE;

    private final Client dbClient;
	
    SingletonEnum() {
        dbClient = Database.getClient();
    }

    public static SingletonEnum getInstance() {
        return INSTANCE;
    }

    public Client getClient() {
        return dbClient;
    }
}

public class Main {
    public static void main(String[] args) {
        SingletonEnum singleton = SingletonEnum.getInstance();
        singleton.getClient();
    }
}

참고 글: https://inpa.tistory.com/entry/JAVA--열거형Enum-타입-문법-활용-정리 [Inpa Dev 👨‍💻:티스토리]

댓글을 작성해보세요.