2020년 7월 7일 화요일

GOF Design Pattern - Factory Method






설명


 사실상 클래스의 기본적인 이용방법.


 생성용 클래스가 있고, 메소드를 이용해 객체를 만들어 냄.

 다른 종류의 객체를 만들 때마다 서브클래스나 템플릿, id parameter 를 이용함.

 


예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MazeFactoryMethod
{
public:
    class Maze* CreateMaze()
    {
        Maze* maze = MakeMaze();
 
        Room* r1 = MakeRoom(1);
        Room* r2 = MakeRoom(2);
        Door* theDoor = MakeDoor(r1, r2);
 
        maze->AddRoom(r1);
        maze->AddRoom(r2);
 
        r1->SetSide(North, MakeWall());
        r1->SetSide(East, theDoor);
        r1->SetSide(South, MakeWall());
        r1->SetSide(West, MakeWall());
 
        r1->SetSide(North, MakeWall());
        r1->SetSide(East, MakeWall());
        r1->SetSide(South, MakeWall());
        r1->SetSide(West, theDoor);
    }
 
protected:
    virtual Maze* MakeMaze() const { return new Maze(); }
    virtual Room* MakeRoom(int n) const { return new Room(n); }
    virtual Wall* MakeWall() const { return new Wall(); }
    virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); }
};
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class BombedMazeGame : public MazeFactoryMethod
{
public:
    BombedMazeGame() : MazeFactoryMethod() {}
 
protected:
    virtual Wall* MakeWall() const { return new BombedWall; }
    virtual Room* MakeRoom(int n) const { return new RoomWithBomb(n); }
};
 
class EnchantedMazeGame : public MazeFactoryMethod
{
public:
    EnchantedMazeGame() : MazeFactoryMethod() {}
 
protected:
    virtual Room* MakeRoom(int n) const { return new EnchantedRoom(n, CastSpell()); }
    virtual Door* MakeDoor(Room* r1, Room* r2) const { return new DoorNeedingSpell(r1, r2); }
 
    Spell* CastSpell() const { return new Spell("spell"); };
};
cs


MazeGame 이 추상클래스여도 되고, 위처럼 구체 클래스여도 됨.

근데 일일히 오버라이드 하는게 말이 안되고, 예측할 수 없는 함수도 오버라이드 해야하므로 대개 구체 클래스를 이용함.

BombedMazeGame 을 만들려면 이 클래스를 생성해서 CreateMaze() 호출하면 오버라이드 된 것들이 자동으로 적용되서 하나가 만들어짐.



추가 설명

 Abstract Factory 가 구현된걸보면 대개 Factory Method 로 구현되어 있음.

 이때 사용하는 Method 는 MakeClassName, DoClassName 이런게 많이 쓰임.

댓글 없음:

댓글 쓰기

List