728x90

팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 정의하고 어떤 클래스의 인스턴스를 생성할 지는 서브 클래스에서 결정합니다.

 

서브 클래스에서 오버라이드 된 메서드를 통해서 객체 생성 작업을 서브클래스에 캡슐화 시킬 수 있어서 클라이언트와 서브 클래스의 코드를 분리해서 유지 보수나 코드 수정에 유용합니다.

 

 

class PizzaStore
{
public:
    PizzaStore() {}
    virtual ~PizzaStore() {}

    virtual Pizza* createPizza( int number ) = 0;

    virtual Pizza* orderPizza( int number )
    {
        Pizza* pizza;

        pizza = createPizza( number );

        pizza->prepare();
        pizza->bake();
        pizza->cut();
        pizza->box();

        return pizza;
    }
};

class ChicagoPizzaStore : public PizzaStore
{
public:
    ChicagoPizzaStore()
    {
        cout<<"시카고 피자 가계 오픈"<<endl;
    }
    ~ChicagoPizzaStore()
    {
        cout<<"시카고 피자 가계 닫음"<<endl;
    }
    Pizza* createPizza( int number ) override
    {
        Pizza* object = NULL;
        switch( number )
        {
        case 1: /// 페퍼로니 피자
            object = new ChicagoPepperoniPizza();
            break;
        case 2: /// 치킨 피자
            object = new ChickenPizza();
            break;
        default:
            return object;
        }
        return object;
    }
};

class NewYorkPizzaStore : public PizzaStore
{
public:
    NewYorkPizzaStore()
    {
        cout<<"뉴욕 피자 가계 오픈"<<endl;
    }
    ~NewYorkPizzaStore()
    {
        cout<<"뉴욕 피자 가계 닫음"<<endl;
    }
    Pizza* createPizza( int number ) override
    {
        Pizza* object = NULL;
        switch( number )
        {
        case 1: /// 페퍼로니 피자
            object = new PepperoniPizza();
            break;
        case 2: /// 치킨 피자
            object = new ChickenPizza();
            break;
        default:
            return object;
        }
        return object;
    }
};

 

 

Pizza 클래스는 전 글의 심플 팩토리 패턴에서의 클래스와 동일합니다.

PizzaStore라는 클래스를 상위 클래스로 만들고 시카고 피자를 만드는 ChicagoPizzaStore, 뉴욕 피자를 만드는 NewYorkPizzaStore라는 클래스들은 PizzaStore 클래스를 상속 받습니다.

 

createPizza 메서드는 순수 가상 함수이기 때문에 각 하위 클래스인 시카코, 뉴욕 클래스 안에서 반드시 정의를 해주어야 합니다. 이로써 하위 클래스들이 각 객체의 생성을 담당하는 팩토리가 된 것입니다.

 

앞으로는 또 다른 종류의 가계가 늘어 난다고 해도 복잡한 과정이 필요 없이 서브 클래스만 추가 하여 주면 됩니다.

 

*팩토리 메소드 패턴은 하나의 객체 안에서 수많은 다른 객체들이 동적으로 생성되거나, 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을때 사용하면 유용합니다.

728x90
Posted by 정망스
,
728x90

팩토리 패턴이란 객체들의 동적 생성을 책임지고 관리하는 팩토리를 만들어서 확장이나 관리를 효율적으로 할 수 있게 하는 패턴이다.

 

심플 팩토리 패턴이란 나중에 나올 팩토리 메서드 패턴과, 추상 팩토리 패턴의 기본이 되는 부분이자, 단순하게 객체를 생성하여 넘겨주는 역할을 하는 패턴이다.

 

class Pizza
{
protected:
    char name[256];
    char dough[256];
    char sauce[256];
public:
    Pizza(void) {};
    virtual ~Pizza(void) {};
public:
    inline char* getName() { return name; }

    virtual void prepare() /// 피자 준비
    {
        cout<<"============================="<<endl;
        cout<<name<<"를 준비합니다."<<endl;
        cout<<dough<<"도우 반죽중..."<<endl;
        cout<<sauce<<"소스 추가중..."<<endl;
    }
    virtual void bake() /// 피자 굽기
    {
        cout<<name<<"를 굽습니다."<<endl;
    }
    virtual void cut() /// 피자 자르기
    {
        cout<<name<<"를 자릅니다."<<endl;
    }
    virtual void box() /// 피자 포장하기
    {
        cout<<name<<"를 포장합니다."<<endl;
    }
};

class PepperoniPizza : public Pizza
{
public:
    PepperoniPizza(void)
    {
        strcpy_s( name, "페퍼로니 피자" );
        strcpy_s( dough, "일반 " );
        strcpy_s( sauce, "마리나라 " );
    };
    ~PepperoniPizza(void) {};
};

class ChickenPizza : public Pizza
{
public:
    ChickenPizza(void)
    {
        strcpy_s( name, "치킨 피자" );
        strcpy_s( dough, "쌀 " );
        strcpy_s( sauce, "토마토 " );
    };
    ~ChickenPizza(void) {};
};

class SimplePizzaFactory
{
public:
    SimplePizzaFactory() { cout<<"피자 머신 ON"<<endl; }
    ~SimplePizzaFactory() { cout<<"피자 머신 OFF"<<endl; }
public:
    Pizza* createPizza( int number )
    {
        Pizza* object = NULL;
        switch( number )
        {
        case 1: /// 페퍼로니 피자
            object = new PepperoniPizza();
            break;
        case 2: /// 치킨 피자
            object = new ChickenPizza();
            break;
        default:
            return object;
        }
        return object;
    };
};

 

 

 

PepperoniPizza 클래스와 ChickenPizze 클래스는 Pizza 클래스를 상속 받고 있고

Pizza 클래스에는 피자들의 공통되는 메소드 들이 정의 되어 있다.

SimplePizzaFactory 클래스에는 createPizza 메소드에서 동적으로 객체들을 생성해서 넘겨주는 역할을 하고 있다.

 

후에는 새로운 피자를 추가하거나, 혹은 기존 피자 종류를 삭제해야한다면 simplePizzaFactory 클래스안에서 수정해주기만 하면 된다.

 

*심플 팩토리는 하나의 객체 안에서 수많은 서로 다른 객체들이 동적으로 생성될때 사용하면 유용하다.

 

 

728x90
Posted by 정망스
,

옵져버(Observer) 패턴

기타 2016. 10. 13. 08:55
728x90

옵져버 패턴은 어떤 객체의 상태가 변하면 그 객체의 상태에 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 업데이트하게 하는 패턴.

 

쉽게 말하면 (전파자 - 전파를 받는 자들 (일대다))의 관계로 한명이 여러명에게 전달을 하는 거다.

 

아래는 이해하기 쉽도록 스타크래프트의 마린의 상태를 예로 들어 옵져버 패턴을 적용해본 예시이다.

 

마린의 상태는 내가 보는 모니터의 메인화면과, 캐릭터의 상태창, 적의화면에 모두 동일하게 체력상태가 보여야 된다는 것이다.

 

마린의 체력 상태가 변경된다면 메인화면, 상태창, 적의화면이라는 전파를 받는 자들에게 상태를 업데이트하라고 명령을 하는것이다.

 

001.using System;

002.using System.Collections.Generic;
003.using System.Linq;
004.using System.Text;
005.
006.namespace Observer
007.{
008. class Program
009. {
010. static void Main(string[] args)
011. {
012.
013. Marine ourMarine = new Marine("아군 마린", 100);
014. ourMarine.Attach(new MainScreen());
015. ourMarine.Attach(new StatusScreen());
016. ourMarine.Attach(new EnemyScreen());
017.
018. ourMarine.Health = 60;
019. ourMarine.Health = 40;
020.
021. Console.ReadKey();
022. }
023.
024. abstract class Unit
025. {
026. private string name;
027. private int health;
028. private List<UnitViewer> unitViewers = new List<UnitViewer>();
029.
030. public Unit(string name, int health)
031. {
032. this.name = name;
033. this.health = health;
034. }
035.
036. public void Attach(UnitViewer investor)
037. {
038. unitViewers.Add(investor);
039. }
040.
041. public void Detach(UnitViewer investor)
042. {
043. unitViewers.Remove(investor);
044. }
045.
046. public void Notify()
047. {
048. foreach (UnitViewer unitviewr in unitViewers)
049. {
050. unitviewr.Update(this);
051. }
052. }
053.
054.
055. public int Health
056. {
057. get { return health; }
058. set
059. {
060. health = value;
061. Notify();
062. }
063. }
064.
065. public string Name
066. {
067. get { return name; }
068. }
069. }
070.
071. class Marine : Unit
072. {
073. public Marine(string name, int health)
074. : base(name, health)
075. {
076. }
077. }
078.
079.
080. interface UnitViewer
081. {
082. void Update(Unit unit);
083. }
084.
085.
086. class MainScreen : UnitViewer
087. {
088. private Unit unit;
089.
090. public void Update(Unit _unit)
091. {
092. this.unit = _unit;
093. Console.WriteLine("메인화면 {0} 상태 변경 : 체력 {1}", this.unit.Name, this.unit.Health.ToString());
094. }
095.
096. public Unit Unit
097. {
098. get { return unit; }
099. set { unit = value; }
100. }
101. }
102.
103. class StatusScreen : UnitViewer
104. {
105. private Unit unit;
106.
107. public void Update(Unit _unit)
108. {
109. this.unit = _unit;
110. Console.WriteLine("상태창 {0} 상태 변경 : 체력 {1}", this.unit.Name, this.unit.Health.ToString());
111. }
112.
113. public Unit Unit
114. {
115. get { return unit; }
116. set { unit = value; }
117. }
118. }
119.
120. class EnemyScreen : UnitViewer
121. {
122. private Unit unit;
123.
124. public void Update(Unit _unit)
125. {
126. this.unit = _unit;
127. Console.WriteLine("적 상태창 {0} 상태 변경 : 체력 {1}", this.unit.Name, this.unit.Health.ToString());
128. }
129.
130. public Unit Unit
131. {
132. get { return unit; }
133. set { unit = value; }
134. }
135. }
136. }
137.}

 

 

Marine 클래스는 Unit이라는 클래스를 상속받고 있고, Attach 메소드를 통해서 UnitViewer(메인화면), StatusScreen(상태창), EnemyScreen(적 상태창) 이 3개의 클래스들 즉 전파를 받을 자들을 등록한다.

 

위 3개의 클래스들은 UnitViewer라는 인터페이스를 상속받고 있고 인터페이스 안에 있는 Update 함수를 각 클래스들에 맞게 재정의 해주고 있다.

 

이제 마린의 체력 상태가 바뀌게 되면 체력 수치를 바꾸고 Notify 메소드를 통해 등록되어있는 전파자들에게 Update 함수를 실행하도록 한다.

 

728x90
Posted by 정망스
,

winsock i/o 모델 종류..

기타 2016. 10. 10. 19:04
728x90

Windows용 Winsock 네트워크 프로그램의 모델은 다음 6가지로 나뉜다. 아래로 갈수록 더 좋은 성능을 보인다.

1. Blocking Model

- 단순한 구조로 각 connection 마다 thread를 할당하여 처리. blocking 함수를 사용

2. Select Model

- select함수를 이용

3. WSAAsyncSelect Model

- WASAsyncSelect함수이용. 소켓이벤트발생시 윈도우즈 메시지 통보 받음

4. WSAEventSelect Model

- WASEventSelect함수이용. Event Object를 이용하여 소켓이벤트 통보 받음

5. Overlapped I/O Model

-  Overlapped 구조체 사용. 비동기적인 I/O작업수행

6. Completion Port (IOCP)

- Win32 커널오브젝트를 사용. 재사용 가능한 쓰레드 풀유지.

 

728x90
Posted by 정망스
,
728x90

 

140113.txt

140114.txt

140115.txt

140116.txt

140117中.txt

140120.txt

 

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침