싱글턴 패턴 정의

하나의 프로그램에서 오직 1개의 인스턴스만을 다루는 패턴이다. 다른 모든 인스턴스에서는 싱글턴 패턴의 인스턴스를 어디서든 끌어와서 쓸 수 있다. 생성자의 접근 권한이 private로 한정되어 있어서 다른 인스턴스에서는 직접적으로 인스턴스를 생성시키지 못한다.

필요한 상황

1. 모든 인스턴스에서 동일한 상태의 인스턴스가 필요한 경우
2. 1개의 인스턴스로 충분한 경우 (일례 : 프로그램 설정정보, 쓰레드 풀)
3. 2개 이상의 인스턴스 생성을 막기 위한 경우

Class 다이어그램

코드

1. Helper Class

public class Helper
{
	static Helper _helperInstance = new Helper();

	private Helper() { }

	static public Helper getInstance()
	{
		return _helperInstance;
	}

	public void UseThis()
	{
		Console.WriteLine("HI I'm singleton instance!");
	}
}

2. main code

Helper.getInstance().UseThis();

 

코드 설명

1. Helpclass
정의한 Class 내부에 static 예약어로 자기 자신의 인스턴스를 할당하였다. 이는 전연변수처럼 프로그램을 시작할때 메모리에 미리 할당하여 사용한다는 의미이다. 그외 특이점은 생성자의 접근 제한자를 private으로 정의하여 자기 자신을 제외하고 생성을 못하게 하였다.
해당 싱글턴 패턴의 인스턴스를 가져오기 위해서는 오직 getInstance 함수를 통해 가져올 수 있다.
 
2. main code
싱글턴 패턴의 인스턴스를 사용하는 방법이다.

설명 보충을 위한 그림 자료

필요에 따라 추가 설명

싱글턴 패턴은 전역 변수와 유사하다. 하지만 몇가지 차이점이 있다.

  차이점 1. 전역 변수는 결국 Class 외부에서 new 예약어를 통해 메모리를 할당하기 때문에 1개 이상의 인스턴스를 생성할 수 있다. 이는 프로그램에 오직 1개의 인스턴스를 생성하려하는 부분을 충족시키지 못한다.
  차이점 2. Class 내부에서 생성을 다루기 때문에 아래 코드와 같이 인스턴스를 사용하기 직전에 생성시키는 방법을 사용할 수 있다.(lazy initialization

public class Helper
{
	static Helper _helperInstance;

	private Helper() { }

    
	static public Helper getInstance()
	{
		lock(typeof(Helper))
		{
			if (_helperInstance == null)
			{
				_helperInstance = new Helper();
			}
		}

		return _helperInstance;
	}

	public void UseThis()
	{
		Console.WriteLine("HI I'm singleton instance!");
	}
}

lock 예약어를 사용하는 이유는 멀티 스레드를 이용할 경우 여러 스레드에서 동시에 생성을 요청할 경우를 막기 위해서 사용하는 것이다.
 

정리 및 결론

1. 싱글턴 패턴은 정말 많이 사용하는 패턴이다.
2. WPF를 사용할때에 MVVM Silverlight 를 사용했었는데 개별 ViewModel의 인스턴스를 관리하는 인스턴스에 사용한 사례를 봤었다. 이처럼 프로그램의 전체를 다루는데(일례 : 서로 다른 ViewModel 간 데이터 교환 등..) 효과적인 패턴이다. 
3. 마지막으로 오늘 탈피한 리챠드 :)

2023년 03월 03일

'Program > SW Design Patterns' 카테고리의 다른 글

CH5 데코레이터 패턴  (1) 2023.03.05
CH4 팩토리 패턴  (0) 2023.03.04
CH3 옵저버 패턴  (0) 2023.03.03
CH1 전략 패턴  (0) 2023.03.02
개요  (0) 2023.03.01

+ Recent posts