커맨드 패턴은 각각의 요구 사항을 캡슐화 하여 그 내용을 실행 시키게 한다.

예를 들어 불을 켜거나 끌 때에 각기 해당 내용이 실행되는 것을 생각해보면 될 것이다.

전문적인 용어 상황에서 본다면

클라이언트의 요구에 의해 인보커는 그 요청에 대한 내용을 실행하도록 리시버에 요청을 하면 리시버는 그 내용을 실행한다.

커맨드 패턴은 주로 스케쥴러, 스레드 풀, 큐 같은 용도에서 쓸 수가 있고

순차적으로 이루어진 작업임으로 이 전 데이터로 돌리기도 쉬운편이다.


Main에서 먼저 Remote(인보커)를 생성하고, 그 후 리시버(Command)에 특정 행동들을 요구한다(Lignt, Door).

VS2008에서의 다이어그램 구성은 저기 까지 나옴으로 샘플을 참조하는 것이 좋을 것 같다.

싱글톤 패턴..

유일하게 하나의 정의만 있어야 하는 패턴이다.

일반적으로 우리가 쓰는 싱글톤은 다음과 같이 쓸 것이다.

Object m_obj;
Object _obj
{
    get
       {
           if(m_obj==null)
              m_obj = new Object
           return m_obj;
       {
}

하지만 여기에서 문제가 있다.

멀티스레드에 의해서 생기는 문제로 동기화가 되지 않아 여러번 생성이 된다는 경우가 종종 생긴다.

그럴 경우에는 분명 데이터가 뒤죽 박죽으로 흘러 갈 것이다.

그 다음으로 쓰는 방법이 아마 일반적으로 static 을 이용 할 것이다.

static Object m_obj;
static Object _obj
{
    get
       {
           if(m_obj==null)
              m_obj = new Object
           return m_obj;
       {
}

이는 어느 정도 문제를 해결해 주지만 한번도 쓰이지 않을 경우 메모리만 선점하고 있다는 문제가 생긴다.

필자도 저 방식으로 종종 쓰는 경우가 많다(쓰레드 환경 제외)

멀티쓰레드라면 아마 이 방법이 제일 좋을 것 같다. lock 키워드를 이용하는 것이다.

(lock은 monitor와 같이 동기화를 이용 할 때 쓰는 키워드이다.)

static Object m_obj;
static Object _obj
{
    get
       {
           if(m_obj==null)
              lock(m_obj)
              {
                 m_obj = new Object
              }
           return m_obj;
       {
}

이 방법은 인스턴트 생성시 걸리는 시간 때문이다. 이렇게 lock을 걸어 둔다면 멀티쓰레드 환경 상에서는 최소한의 속도가 유지 될 것이다.
데코레이터 패턴.

메인 객체에 각기 더 올리고자 하는 객체들을 덧 씌워서 그 결과를 나타낸다.

쉽게 생각하면 커피를 떠올리면 된다.

에스프레소에 우유를 넣고 모카를 넣고 원하는 취향대로 하면 하나의 제품이 나온다.

특징이라고 하면 한 객체를 여러 데코레이터들로 감쌀 수 있다는 것과

자신이 장식한 객체에 어떤 행동을 위임 또는 추가적인 작업을 할 수 있다.

즉 언제든 객체를 감쌀 수가 있기에 프로그램 실행 중 유동적으로 데코레이터를 이용 할 수 있다.

아래는 다이어그램과 샘플 코드 이다.