디자인패턴에 대해서 관심이 많았으니 특별한 동기가 없어 공부를 하지 않았습니다. 여전히 동기는 없지만 좀더 강한 압박을 위해 이 공간에 강좌를 올리겠습니다. 내용은 아래 있는 참고자료를 통해 공부하면서 예제를 모두 C#으로 바꿔볼 생각입니다. 저 역시 공부하면서 올리는 것이므로 고수님들의 많은 조언과 격려 부탁드립니다. 감사합니다.
----------------------------------------------------------------------------------
1.1 Singleton 디자인 패턴 클래스에서 인스턴스를 정확히 하나만 생성하는 것을 보장해야 하는 경우 사용한다. 이렇게 생성한 인스턴스는 연결관리가 필요한 커넥션이나 프린터 출력 등에서 사용이 가능하다. 개인적으로는 어플리케이션 전반에 적용되는 셋팅 옵션등에서도 효과를 나타낼 수 있을 것으로 판단된다. 아래 C#을 이용한 예제를 첨부할 것이고 간단한 설명은 첨부의 주석으로 처리하도록 하겠다.
-- 예제 -- /* 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; } }
/// <summary> /// MySingleton을 실행하기 위한 클래스 /// </summary> public class Code { static void Main() { 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(); } }
********************************************* 쓴사람 김종령 참고자료 Professional VB.NET 디자인패턴 (정보문화사) - 위 참고자료는 예제기준이 VB입니다. 이것을 C#코드로 변경하고 내용을 간단하게 줄였습니다. ********************************************* 출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1053&page=22 |