using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Console_Patten
{
/// <summary>
/// MySingleton을 실행하기 위한 클래스
/// </summary>
class Program
{
static void Main(string[] args)
{
MySingleton objTest1 = null; //첫번째 인스턴스
MySingleton objTest2 = null; //두번째 인스턴스
int i = 0;
//첫번째 object에 MySingleton 인스턴스를 전달하고 시간을 출력해 본다.
objTest1 = MySingleton.GetInstance();
System.Console.WriteLine("인스턴스 호출 = " + System.DateTime.Now.ToLongTimeString()
+ ";" + "objTest1.TimeOfBirth() = " + objTest1.TimeOfBirth);
//시간 지연을 위한 코드 *본인PC에서는 약 2초의 지연이 생김*
for (i = 1; i < 1500000000; i++)
{
}
//두번째 object에 MySingleton 인스턴스를 전달하고 시간을 출력해 본다.
objTest2 = MySingleton.GetInstance();
System.Console.WriteLine("인스턴스 호출 = " + System.DateTime.Now.ToLongTimeString()
+ ";" + "objTest2.TimeOfBirth() = " + objTest2.TimeOfBirth);
//두개의 object의 생성시간이 같은것을 볼 수 있다.
System.Console.ReadLine();
}
}
/*
static 멤버인 m_Instance는 객체의 단일 공유 인스턴스이다.
이 단일 공유 인스턴스는 공개함수인 GetInstance()에 의해 참조값이 반환된다.
GetInstance는 m_Instace가 null인 경우에만 m_Instance를 생성하므로서 단일성을 유지한다
생성자는 Private로 만들어 숨겨져 있다.
m_TimeOfBirth는 단지 테스트를 위한 멤버이다. 이것은 이 인스턴스가 생성된 시간을 가지고 있다.
*/
/// <summary>
/// 유일성을 유지하고 싶은 클래스
/// </summary>
public class MySingleton
{
private static MySingleton m_Instanace = null;
// 쓰레드로부터 안전한 인스턴스 생성을 위해 Mutex사용
private static System.Threading.Mutex m_Mutex = new System.Threading.Mutex();
#region 예제를 위한 부분 실사용중에는 별로 필요치 않음
private static string m_TimeOfBirth = "";
public string TimeOfBirth
{
get
{
return m_TimeOfBirth;
}
}
#endregion
/// <summary>
/// 생성자 Private으로 존재한다. 필요하지 않은것은 아니며 단지 숨겨져 있을 뿐이다.
/// </summary>
private MySingleton()
{
System.Console.WriteLine("Singleton 생성시간 = " + System.DateTime.Now.ToLongTimeString());
m_TimeOfBirth = System.DateTime.Now.ToLongTimeString();
}
/// <summary>
/// 인스턴스를 리턴하는 함수이며 인스턴스가 null인 경우에만 인스턴스를 생성한다.
/// </summary>
/// <returns>MySingleton 인스턴스 (this.m_Instance)</returns>
public static MySingleton GetInstance()
{
m_Mutex.WaitOne();
if (m_Instanace == null)
{
m_Instanace = new MySingleton();
}
m_Mutex.ReleaseMutex();
return m_Instanace;
}
}
}
singletone은 다른 패턴들과도 어울려서 사용할 수 있는데, 다음과 같은 경우들이다.
- facade 객체는 단지 하나의 객체만이 요구되는데, 이를 보장하기 위해서 singletone을 사용할 수
있다. 예를들어 컴퓨터를 가동시키는 facade 클래스가 있다고 가정해보자. 컴퓨터를 가동시키기 위한 여러가지 공정들 즉 cpu
freeze, memory load, cpu jump,
cpu execute은 단지 하나의 객체가 생성되어서 수행되는 것을 보장해야 할 것이다.
- 때때로 singleton 패턴은 전역변수를 제한하기 위해서 사용되기도 한다. 전역변수를 모아서 하나의 single 클래스에 담아두는 방식으로 사용한다. 전역변수문제를 해결하기 위한 용도로 사용할 경우에 singleton 패턴자체가 전역클래스가 된다는 문제점이 있지만, namespace 충동물제를 해결하고 전역변수를 한 지점에서 관리할 수 있다는 것만으로도 singleton 패턴은 충분히 역할을 해낼 것이다.
'GET > Patten' 카테고리의 다른 글
prototype 패턴 (쌍둥이) 과 singleton 패턴 (0) | 2009.09.30 |
---|