Singleton Pattern(싱글톤 패턴)

DOYOUNG KIM·2023년 3월 22일
0

Singleton Pattern

1. 싱글톤이란

싱글톤 패턴은 하나의 인스턴스만 생성하여 사용하는 디자인 패턴
해당 객체에 메모리를 정적으로 할당하여 하나의 객체에만 접근하는 방식이다.
인스턴스가 필요할때 새로운 인스턴스를 사용하는 것이 아닌 기존의 인스턴스를 그대로 사용하는 것이다.

생성자가 여러번 호출되어도 실질적으로 생성되는 객체는 하나이며 최초로 생성된 이후 호출된 생성자는 이미 생성한 객체를 반환시키는 것이다.

static을 이용해서

2. 싱글톤 사용 이유

객체를 계속해서 생성하여 메모리를 할당하는 낭비를 방지하기 위해 사용한다.
또한 싱글톤 패턴은 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유가능 하다
개념적으로는 Static과 흡사하다고 느껴진다.

주로 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 사용
또는 인스턴스가 절대적으로 하나만 존재해야 하는 상황

3. 단점

문제점객체 지향 설계 원칙중 개발-폐쇄 원칙 이란것이 존재
싱글톤 인스턴스가 혼자 일이 만항지면 클래스간의 개입이 심해져 이 원칙 위반
멀티 쓰레드 환경에서 동기화 처리를 하지 않으면 인스턴스가 2개 생성되는 문제 발생

4. 싱글톤 구현

일반 클래스에서 싱글톤 패턴 적용

public class SingletonClass
	{
		private static SingletonClass _instance;
 
		public static SingletonClass Instance
		{
			get
			{
        		// 생성된 인스턴스가 없으면 생성합니다.
				if (_instance == null) 
				{
					_instance = new SingletonClass();
				}
				return _instance;
			}
		}
 
		public SingletonClass()
		{
			
		}
	}

Lazy 싱글톤 적용

인스턴스의 생성 시기를 선언 즉시 생성이 아니라 인스턴스 내에 있는 값을 접근하려 할 때 생성시켜주는 방법으로 보다 효율적으로 사용할 수 있다. 또한 일반적인 싱글톤에서는 thread-safety를 추가적으로 고려해야 하지만 Lazy 싱글톤을 사용하면 이를 고려하지 않아도 보장된다는 장점이 있다.

(Lazy 싱글톤을 이용한 thread-safety 보장은 인스턴스의 생성에 대한 thread-safety를 보장하는 것이지 이미 생성된 인스턴스의 접근에 대한 보장이 아님.)

public class SingletonLazy<T> where T : SingletonLazy<T>, new() //제너릭 형식 제약조건(옵션)
	{
		private static Lazy<T> lazyInstance = null;
 
		public static T Instance
		{
			get
			{
				if (Exists() == false)
				{
					var instance = new T();
					lazyInstance = new Lazy<T>(() => instance);
				}
 
				return lazyInstance.Value;
			}
		}
		//인스턴스가 만들어졌는지 체크합니다.
		public static bool Exists()
		{
			return lazyInstance != null && lazyInstance.IsValueCreated;
		}
		//인스턴스 생성이력을 초기화 할때 사용합니다.
		public static void ClearInstance()
		{
			lazyInstance = null;
		}
	}
profile
매일 1%씩 성장하는 개발 공부 블로그 입니다.

0개의 댓글