설명
사실상 클래스의 기본적인 이용방법.
생성용 클래스가 있고, 메소드를 이용해 객체를 만들어 냄.
다른 종류의 객체를 만들 때마다 서브클래스나 템플릿, 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 이런게 많이 쓰임.
댓글 없음:
댓글 쓰기