싱글턴 패턴이란 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴. 하나의 인스턴스만을 생성하며, getInstance 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행한다.
작성 방법은 다음과 같습니다.
Java
public class SingleTon {
private static SingleTon mSingleton;
public static SingleTon getInstance(){
if(mSingleton == null){
mSingleton = new SingleTon();
}
return mSingleton;
}
}
Kotlin
class SingleTon{
companion object {
var mSingleTon: SingleTon? = null
fun getInstance(): SingleTon = mSingleTon ?: SingleTon()
}
}
사실 kotlin의 경우 위처럼 안하구 간단하게
//선언
object Singleton {}
//사용
val singleton = Singleton
사용 할 수 있습니다. 근데 위처럼 하는 이유는 생산자를 통하여 singleton class 내부에 먼가 데이터를 더 추가할 때 사용 됩니다.
아무튼 이런 singleton은 하나의 인스턴스를 사용하기 때문에 프로젝트 전체에서 한개의 인스턴스를 통하여 그 인스턴스 내부의 동일한 데이터에 접근할 수 있다는 점이 있습니다.
하지만 이런 singleton에도 문제 점이 있습니다. 문제점은 동기화 문제 입니다.
인스턴스가 만들어 지기 전에 다중 스레드를 통하여 singleton을 사용해버리면 경합 조건(Race Condition) 을 발생하여 2개의 인스턴스가 생성될 수 있습니다. singleton은 하나의 인스턴스를 만들어서 어디서든 그 인스턴스에 접근하는 방식인데 2개의 인스턴스가 만들어지면 문제가 될 수 있습니다.
그래서 이 해결방법은
1. syncronized 사용입니다.
public class SingleTon {
private static SingleTon mSingleton;
public static synchronized SingleTon getInstance(){
if(mSingleton == null){
mSingleton = new SingleTon();
}
return mSingleton;
}
}
syncronized를 통하여 동기화를 맞춰 줍니다.
2. 인스턴스를 만들어서 초기화 하기
public class SingleTon {
private static SingleTon mSingleton = new SingleTon();
public static SingleTon getInstance(){
return mSingleton;
}
}
미리 초기화를 해두면 다중 스레드에서 접근해도 이미 만들어져 있기 때문에 getInstance를 통하여 동일한 인스턴스를 획득할 수 있습니다.
참고
https://gmlwjd9405.github.io/2018/07/06/singleton-pattern.html
'2023년 이전 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 컴퍼지트 패턴 (Composite Pattern) (0) | 2019.11.19 |
---|---|
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2019.11.18 |
디자인 패터 - 옵저버 패턴(Observer Pattern) (0) | 2019.11.18 |
디자인 패턴 - 커맨드 패턴(Command Pattern) (0) | 2019.11.15 |
디자인 패턴 - 스트래티지 패턴 (strategy pattern) (0) | 2019.11.13 |