private
생성자를 가지는 특징이 있으며, 생성된 싱글톤 오브젝트는 저장할 수 있는 자신과 같은 타입의 static
필드를 정의한다.static
메서드를 통하여 객체를 생성한다.public class Singleton {
private static Singleton singleton = null;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
private
와 static
private
을 사용하기 때문에 → 외부에서 new
로 객체 생성이 불가하다.static
이 붙은 클래스 / 메서드 → 정적공간, 메모리 용량이 딱 정해져있다.static
이 아닌 것들은 객체가 생성될 때마다 메모리를 차지하지만 static
으로 선언되면 객체가 얼마나 만들어지던 메모리에 지정된 공간에 하나씩만 존재하게 된다.new
키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 DIP
를 위반하게 되고 OCP
원칙 또한 위반할 가능성이 높다.SRP
- 단일 책임의 원칙OCP
- 개방-패쇄 원칙LSP
- 리스코프 치환의 원칙ISP
- 인터페이스 분리의 원칙DIP
- 의존성 역전의 원칙private
생성자 때문에 테스트가 번거롭다.public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
public static final Singleton INSTANCE = new Singleton();
}
}
private
static
으로 인스턴스 변수 만들기private
으로 생성자를 만들어 외부에서의 생성을 막음1번의 성능저하를 완화시키는 방법
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
public static final Singleton INSTANCE = new Singleton();
}
}
synchronized
를 통해 동기화를 시켜 인스턴스를 생성하는 방법synchronized
를 실행하지 않기 때문에 성능저하 완화가 가능함클래스 안에 클래스(
holder
)를 두어JVM
의 클래스 로더 매커니즘과 클래스가 로드되는 시점을 이용한 방법
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
public static final Singleton INSTANCE = new Singleton();
}
}
JVM
의 클래스 초기화 과정에서 보장되는 원자적 특성
을 이용해 싱글톤의 초기화 문제에 대한 책임을 JVM
에게 떠넘기는 걸 활용한다.holder
에서 선언된 인스턴스는 static
이기 때문에 클래스 로딩시점에서 한번만 호출된다.final
을 사용해서 다시 값이 할당되지 않도록 만드는 방식이다.사용자가 어떠한 페이지에서 다크모드를 설정하면 다른 모든 페이지에서도 다크모드로 나와야한다.
new
로 다크모드를 설정해주는 객체를 생성하지 않아도 되도록 하기 위해 싱글톤 패턴을 사용한다.static
으로 정적 변수에 저장된 값을 다른 페이지에서 그대로 가져다 쓰게하여 매번 new
로 다크모드를 설정해주는 객체를 생성하지 않아도 계속해서 변수 값을 불러와 일정한 설정 유지 가능참고 자료
싱글톤(Singleton) 패턴이란?
[JAVA] 싱글톤 패턴(Singleton Pattern) : 멀티 스레드 환경에서의 문제점
싱글톤 패턴(Singleton pattern) | 👨🏻💻 Tech Interview
2. 싱글톤 패턴(Singleton Pattern)
객체지향 디자인패턴 1