'GET/Patten'에 해당되는 글 2건

  1. 2009.09.30 prototype 패턴 (쌍둥이) 과 singleton 패턴
  2. 2009.09.30 singleton pattern 싱글톤 패턴
posted by 방랑군 2009. 9. 30. 15:17

1. prototype 패턴 (쌍둥이)
이미 생성된 객체를 복제해서 새로운 객체를 생성하는 방법

(게임블리오에서 clone() 개념으로 오브젝트의 정점 구성정보는 같지만 위치행렬와 같이 서로 다른 정보를 가져야하는것은 다르게 할수 있다)

- 객체 생성 방식이나 구성 형태, 표현 방식 등과 무관하게 객체를 생성 하고 싶을때 유용
- 생성할 객체가 run-time 시에 결정 되어 질때 유용


2. singleton 패턴 (단 한개!)
객체가 생성되는 개수를 제한 하는 형태의 설계가 singleton 패턴 이라 하고 극단적으로 제한되는 객체의 개수가 1개일 때를 감안한 패턴 (최대 N개 까지만 객체를 생성 하도록 제한)
- 패턴 구현시 모든 생성자는 protected 영역에 정의 되어야 함.
- 상속 관계에 놓인 클래스들에 대해 전체적으로 생성되는 객체의 최대 개수를 제한 하고자 할때 유용

'GET > Patten' 카테고리의 다른 글

singleton pattern 싱글톤 패턴  (0) 2009.09.30
posted by 방랑군 2009. 9. 30. 10:09
영어사전의 뜻
singleton
- 1 하나씩 일어나는 일, 홀로인 것, 독자(獨子) 2 (카드놀이의) 한 장 패(의 수)


뜻 : 
개체가 하나의 인스턴스를 가지는것을 보장하며, 그 개체를 전역적인 면에서 접근하는 것을 보장함.
생성된 인스턴스를 어디서든지 접근할 수 있게 하기 위한 패턴

KEY POINT :
 멀티스레딩 환경에서 여러개의 개체가 만들어 질 수 있다.
그래서, 동기화 한다.

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은 한번에 하나씩의 패만 보여준다는 의미를 가지고 있다. 좀더 일반적으로는 한번에 하나의 사건만 일어나도록 한다라는 의미로 해석할 수 있을 것 같다.

소프트웨어 엔지니어링 영역에서의 singletone은 객체지향프로그래밍시 클래스가 단하나의 사건, 즉 다시 말해서 단 하나의 인스턴스만을 가지도록 하는 패턴이다. 이 패턴은 주로 중요한자원을 관리하고자 할때, 다수의 인스턴스가 생성되지 않도록 만들어준다. 예컨데, 한번에 하나의 인스턴스만이 데이터베이스에 연결되는게 보장받기를 원하는 경우에 사용할 수 있을 것이다.
singletone은 다른 패턴들과도 어울려서 사용할 수 있는데, 다음과 같은 경우들이다.
  1. facade 객체는 단지 하나의 객체만이 요구되는데, 이를 보장하기 위해서 singletone을 사용할 수 있다. 예를들어 컴퓨터를 가동시키는 facade 클래스가 있다고 가정해보자. 컴퓨터를 가동시키기 위한 여러가지 공정들 즉 cpu freeze, memory load, cpu jump, cpu execute은 단지 하나의 객체가 생성되어서 수행되는 것을 보장해야 할 것이다.
  2. 때때로 singleton 패턴은 전역변수를 제한하기 위해서 사용되기도 한다. 전역변수를 모아서 하나의 single 클래스에 담아두는 방식으로 사용한다. 전역변수문제를 해결하기 위한 용도로 사용할 경우에 singleton 패턴자체가 전역클래스가 된다는 문제점이 있지만, namespace 충동물제를 해결하고 전역변수를 한 지점에서 관리할 수 있다는 것만으로도 singleton 패턴은 충분히 역할을 해낼 것이다.

'GET > Patten' 카테고리의 다른 글

prototype 패턴 (쌍둥이) 과 singleton 패턴  (0) 2009.09.30