Design Pattern by Csharp
Singleton Pattern ( 싱글턴 패턴 )
1. Singleton Pattern 정의
- 해당 클래스의 인스턴스가 하나만 생성이 되는 것을 보장하며 어디서든지 그 인스턴스에 접근이 가능하도록 만드는 패턴
(Ensure a class has only one instance and provide a global point of access to it.)
2. UML Diagram
: 싱글톤 패턴에서는 클래스에 Intance라는 멤버변수를 선언을 하고 (private), 생성자를 private로 선언하여 외부에 노출이 되지 않도록 한다. 이후 static으로 전역에서 접근이 가능한 메서드를 생성해서 인스턴스를 반환한다.
이때 맴버변수에 이미 변수가 생성이 되어있다면 해당 인스턴스를 리턴하며, 만약 인스턴스가 한번도 초기화 되지 않았다면, 생성해서 리턴한다.
3. 사용 목적 및 용도
- 시스템에서 전역으로 관리되고 단 하나의 클래스에서만 정보가 유지되는 것을 원할 때
- 보통 시스템 자원이나 정보를 관리한다, 예를 들어 프린터가 하나있는데 그것에 대한 접근 인스턴스가 여러개가 생성되어서 사용이 된다면 데드락이나 오류현상이 발생할 요지가 크다. ( 동기화를 해주면 되겟지만 ...) 이럴 때 하나의 클래스에서만 관리해주면 해결이 된다.
- 스타크래프트에서 사용이 된다고 생각한다면, 게임전체적으로 필요한 시간, 유닛, 킬수, 건물갯수 등이 있을 수 있다.
4. 소스코드
using System;
namespace DesignPattern
{
class MainAPP
{
static void Main()
{
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();
if (s1 == s2)
{
Console.WriteLine("Object are the same Instance");
}
}
}
// 싱글톤 클래스
class Singleton
{
private static Singleton _instance;
private static object _synLock = new object();
// 생성자를 protected 이상의 한정자로 만듬
protected Singleton() { }
// static 메서도르 생성 해야함
public static Singleton Instance()
{
//다중 쓰레드에서는 정상적으로 동작하지 않는 코드이다.
//다중 쓰레드의 경우에는 Instance함수의 동기화가 필요하다
if (_instance == null)
_instance = new Singleton();
// 다중 쓰레드 환경일 경우 Lock이 필요함
if (_instance == null)
{
lock(_synLock)
{
_instance = new Singleton();
}
}
return _instance;
}
}
}
5. 적용 결론
- 전역변수를 사용해서 싱글톤을 사용 안할수도 있지만, 싱글톤은 전역변수를 사용하는 데에서 발생하는 네임스페이스 충돌을 막을 수가 있다.
- 싱글톤 패턴은 ‘게으르게’ 인스턴스가 생성되므로, 객체가 자원을 많이 잡아먹을 때 유용한 생성기법이다.