- Rất khó tái sử dụng phương thức này ₫ể tạo ram ột maze có ₫ặc ₫iểm khác (VD: maze trong ₫ó các phòng có thể có bom hoặc quà tặng, cửa giữa các phòng chỉ có
Các ngữ cảnh nên dùng mẫu Prototype
Bö mön Cöng nghï phền mï̀m Khoa CNTT
ĐH Bach Khoa Tp.HCM
Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML
Slide 297
Chương trình này phát triển từ ví dụ áp dụng mẫu Abstract Factory.
Định nghĩa lớp MazePrototypeFactory thừa kế lớp MazeFactory, ₫ối
tượng lớp này ₫ược cung cấp các prototype ₫ể tạo ra các ₫ối tượng cùng
loại. MazePrototypeFactory có thể₫ược hiện thực trong C++ như sau:
class MazePrototypeFactory : public MazeFactory{ public:
MazePrototypeFactory(Maze*, Wall*, Room*, Door*); virtual Maze* MakeMaze() const;
...// Các method khởi tạo các phần tử của maze private: Maze* _mazePrototype; Room* _roomPrototype; Wall* _wallPrototype; Door* _doorPrototype; } Ví dụ áp dụng Chương 11 : Các mẫu Creational
Constructor của lớp MazePrototypeFactory chỉ khởi tạo các prototype
với các ₫ối tượng tương ứng ₫ược cung cấp từứng dụng: MazePrototypeFactory::MazePrototypeFactory (
Maze* m, Wall* w, Room* r, Door* d ) { _mazePrototype = m; _wallPrototype = w; _roomPrototype = r; _doorPrototype = d; } Ví dụ áp dụng
Bö mön Cöng nghï phền mï̀m Khoa CNTT
ĐH Bach Khoa Tp.HCM
Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML
Slide 299
Các lớp Door, Wall, Room ₫ều phải hiện thực phương thức clone thừa kế
từ lớp MapSite và các phương thức set giá trị nếu cần: class Door : public MapSite {
public: Door();
Door(const Door&);
virtual void Initialize(Room*, Room*); virtual Door* Clone() const;
private: Room* _room1; Room* _room2; };
Door::Door (const Door& other)
{ _room1 = other._room1; _room2 = other._room2; } void Door::Initialize (Room* r1, Room* r2)
{ _room1 = r1; _room2 = r2; }
Door* Door::Clone () const { return new Door(*this); }
Ví dụ áp dụng
Chương 11 : Các mẫu Creational
Các phương thức khởi tạo wall, room, door ₫ều clone prototype có sẵn
và set các giá trị nếu cần:
Wall* MazePrototypeFactory::MakeWall () const { return _wallPrototype->Clone();
}
Door* MazePrototypeFactory::MakeDoor (Room* r1, Room *r2) const { Door* door = _doorPrototype->Clone();
door->Initialize(r1, r2); return door;
}
Bö mön Cöng nghï phền mï̀m Khoa CNTT
ĐH Bach Khoa Tp.HCM
Mön Phân tích & Thiết kế hướng ₫ối tượng dùng UML
Slide 301
Để thay ₫ổi maze cần tạo, ta chỉ cần cung cấp các factory cho
constructor của MazePrototypeFactory :
MazeGame game;
MazePrototypeFactory bombedMazeFactory( new Maze, new BombedWall, new RoomWithABomb, new Door );
Maze* maze = game.CreateMaze(bombedMazeFactory);
Khi bổ sung phần tử sản phẩm mới (VD: roomWithABomb), không cần
phải cung cấp lớp Factory (BombedMazeFactory) ₫ể sinh ra các sản
phẩm này mà chỉ cần cung cấp prototype của sản phẩm ₫ó.
Ví dụ áp dụng
Chương 11 : Các mẫu Creational