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;
}
}
}