-
객체 생성 : 팩토리 메서드 ( Factory Method )Programming/패턴 2020. 11. 9. 02:42
의도
객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 함.
문제
물류 관리 어플리케이션을 만들었다고 생각하자.
현재 트럭으로만 움직이기 때문에 트럭 클래스를 생성해서, 코드의 대부분은 트럭 클래스 내에서 움직이고 있음.
하지만, 어플리케이션이 꽤나 유명해져서 해상 운송 회사에서 배로 운송하고 싶은 수단을 추가하여 만들어달라고 요청이 들어옴.
이럴 때 코드베이스 전체를 뒤집어야하는 현상이 있으며, 다른 수단이 또 추가될 때마다 교통 객체의 클래스마다 동작 조건을 바꾸어 주어야 하며 코드 또한 유지하기가 점점 힘들어진다.
결과
- Product는 객체의 인터페이스를 정의함.
- ConcreteProductA, B는 Product 인터페이스에 정의된 인터페이스를 실제로 구현함.
- Creator는 Product 타입의 객체를 반환하는 팩토리 메서드를 선언함. Creator 클래스는 팩토리 메서드를 기본적으로 구현하는데, 이 구현에서 ConcreteProdcut 객체를 반환함. 또한, Product 객체 생성을 위해 팩토리 메서드를 호출.
- ConcreteCreator : 팩토리 메서드를 재정의하여 ConcreteProduct의 인스턴스를 반환함.
Creator.cpp
class Creator { public: virtual Product* Create(ProductId); }; Product* Creator::Create(ProductId id) { if(id==MINE) return new MyProduct; if(id==YOURS) return new YourProdct; // ... 나머지 }
class MazeGame { public: Maze* CreateMaze(); virtual Maze* MakeMaze() const { return new Maze; } virtual Room* MakeRoom(int n) const { return new Room; } virtual Wall* MakeWall() const { return new Wall; } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); } }; Maze* MazeGame::CreateMaze() { Maze* aMake = MakeMaze(); Room* r1 = MakeRoom(r1); Room* r2 = MakeRoom(r2); Door* theDoor = MakeDoor(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, MakeWall()); r1->SetSide(East, theDoor); r1->SetSide(South, MakeWall()); r1->SetSdie(West, MakeWall()); r2->SetSide(North, MakeWall()); r2->SetSide(East, MakeWall()); r2->SetSide(South, MakeWall()); r2->SetSdie(West, theDoor); return aMaze; } // 다른 게임을 만든다면, class BombedMazeGame : public MazeGame { public: BombedMazeGame(); virtual Wall* MakeWall() const { return new BombedWall; } virtual Room* MakeRoom(int n) const { return new RoomWithBomb(n); } };
참고 자료
http://refactoring.guru/design-patterns/factory-method
Gof 의 디자인 패턴
생성 패턴의 팩토리 메서드 중.
반응형'Programming > 패턴' 카테고리의 다른 글
객체 생성 : 프로토타입 패턴 ( Prototype Pattern ) (0) 2020.09.26 UML 관계 종류 (0) 2020.09.22 객체 생성 : 빌더 패턴 ( Builder Pattern ) (0) 2020.09.22 객체 생성 : 추상 팩토리 패턴 ( Abstract Factory Pattern ) (0) 2020.09.04 객체 생성 : 싱글턴 패턴 ( Singleton Pattern ) (0) 2020.05.04