PSD( Private-Self-Development )

싱글톤 패턴(Singleton pattern) 본문

Backend/디자인패턴

싱글톤 패턴(Singleton pattern)

chjysm 2023. 3. 20. 16:12

싱글톤 패턴? 

객체 인스턴스를 1개만 유지 및 사용하기 위한 디자인 패턴 

 

싱글톤 패턴의 장점

  • 무분별한 인스턴스 생성을 방지하기 때문에, 메모리낭비를 줄일 수 있다.
  • 동일 자원 공유 및 사용
  • 인스턴스가 1개만 존재함을 보증

 

싱글톤 패턴의 단점

  • 객체지향의 단일 책임 원칙을 위반하므로 남용해서는 안된다.
    • 클래스 본연의 목적을 해결하기 위한 본연의 책임
    • 중복 객체 생성 방지를 위한 책임 
  • 자식 클래스 생성 이 불가능하다.
  • 유연성이 떯어진다.

 

싱글톤 패턴 구현

volatile를 이용한 개선된 DCL(Double-Checked-Locking) Singleton 패턴 (jdk 1.5 이상에서 사용)

- jdk  버전에 의존적

public class A {
    private volatile static A instance; 
    
    private A(){
    }

    public static A getInstance() {
        if (instance == null) {
            synchronized (A.class) {
                if (instance == null) {
                    instance = new A();
                }
            }
        }
        return instance;
    }
}

LazyHolder Singleton 패턴

-  getInstance() 메서드에서 LazyHolder.INSTANCE를 참조하는 순간 Class가 로딩되며 초기화가 진행된다. Class를 로딩하고 초기화하는 시점은 thread-safe를 보장하기 때문에 volatile이나 synchronized 같은 키워드가 없어도 thread-safe 하면서 성능도 보장하는 아주 훌륭한 방법이다.

public class A {

    private A(){
    }

    public static A getInstance() {
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder {
        private static final A INSTANCE = new A();
    }
}

 

정적 클래스 와의 차이점

  • 메모리의 상주
    • 싱글톤
      • 메모리 자원에 할당하여 동적 객체를 생성한다.
    • 정적 클래스
      • 코드가 실행되며, 고정으로 바인딩된다.
  • 동적/비동적 차이
    • 싱글톤
      • 인터페이스를 통한 구현 대체 가능 (객체지향 다형성)
    • 정적 클래스
      • 비동적
  • 다른 클래스 와의 관계가 있거나 클래스 초기화 동작이 복잡한 경우, 정적 클래스만으로는  처리가 어렵다.

 


참조

https://javaplant.tistory.com/21

'Backend > 디자인패턴' 카테고리의 다른 글

추상 팩토리 패턴  (0) 2023.05.09
팩토리 메서드 패턴  (0) 2023.03.21
팩토리 패턴  (1) 2023.03.15
옵저버 패턴  (1) 2023.02.17
프록시 패턴  (0) 2023.02.17