Các ngữ cảnh nên dùng mẫu Prototype

Một phần của tài liệu Tài liệu PHÂN TÍCH & THIẾT KẾ HƯỚNG ĐỐI TƯỢNG DÙNG UML pdf (Trang 149 - 152)

- 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 Bach 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 dng 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 dng

Bö mön Cöng nghï phền mï̀m Khoa CNTT

ĐH Bach 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 dng

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 Bach 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 dng

Chương 11 : Các mẫu Creational

Một phần của tài liệu Tài liệu PHÂN TÍCH & THIẾT KẾ HƯỚNG ĐỐI TƯỢNG DÙNG UML pdf (Trang 149 - 152)