메모. Factory method pattern
Factory method pattern은 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 subclass가 내리도록 한다. 이 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 subclass에게 맡길 수 있다.
구조
UML 클래스 다이어그램
- Product: Factory method가 생성하는 객체의 인터페이스를 정의한다.
- ConcreteProduct: Product 클래스에 정의된 인터페이스를 실제로 구현한다.
- Creator: Product 타입의 객체를 반환하는 Factory method를 선언한다. Creator 클래스는 Factory method를 기본적으로 구현하는데, 이 구현에서는 ConcreteProduct 객체를 반환한다. 또한 Product 객체의 생성을 위해 Factory method를 호출한다.
- ConcreteCreator: Product를 실제로 생산하는 클래스. Factory method를 재정의하여 ConcreteProduct의 인스턴스를 반환한다.
장단점
- Facotry method로 클래스 내부에서 객체를 생성하는 것이 객체를 직접 생성하는 것보다 훨씬 응용성이 높아진다.
- OCP(Open-Closed Principle). 기존의 client 코드를 수정하지 않고 새로운 유형의 제품을 프로그램에 넣을 수 있다.
예시
아래와 같이 MazeGame 클래스 내에 Factory method를 정의한다. 여기서 MakeMaze(), MakeRoom(), MakeWall(), MakeDoor() method가 Factory method다.
class MazeGame
{
public:
Maze* CreateMaze(MazeBuilder&);
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); }
};
Factory method를 통해 CreateMaze를 다시 써보면 아래와 같다.
Maze* MazeGame::CreateMaze(MazeBuilder& builder) {
Maze* aMaze = MakeMaze();
Room* r1 = MakeRoom(1);
Room* r2 = MakeRoom(2);
Door* theDoor = MakeDoor(r1, r2);
aMaze->AddRoom(r1);
aMaze->AddRoom(r2);
r1->SetSide(North, MakeWall());
r1->SetSide(East, theDoor);
r1->SetSide(South, MakeWall());
r1->SetSide(West, MakeWall());
r2->SetSide(North, MakeWall());
r2->SetSide(East, MakeWall());
r2->SetSide(South, MakeWall());
r2->SetSide(West, theDoor);
return aMaze;
}
다른 미로 게임을 만든다면, MazeGame 클래스를 상속해서 미로의 부분을 재정의하면 된다. 예를 들어, BombedMazeGame 클래스는 Room과 Wall 객체를 다시 정의하여 폭탄을 맞은 것들을 반환하도록 만든다.
class BombedMazeGame : public MazeGame {
public:
BombedMazeGame();
virtual Wall* MakeWall() const
{
return new BombedWall;
}
virtual Room* MakeRoom(int n) const
{
return new RoomWithBomb(n);
}
};
'프로그래밍 관련 > 객체 지향 설계' 카테고리의 다른 글
메모. Proxy pattern (0) | 2019.11.18 |
---|---|
메모. Facade pattern (0) | 2019.11.17 |
메모. Builder pattern (0) | 2019.05.18 |
메모. Concrete class (1) | 2019.05.13 |
메모. Abstract factory pattern (0) | 2019.05.13 |