Design Pattern: Builder
Hello. Chào mừng các bạn đến với chủ đề Design Pattern.
mẫu thiết kế tiếp theo trong nhóm: Creation Pattern. Đó là mẫu : Builder Design Pattern
1. Bài toán ví dụ thực tế cho mẫu Builder Pattern.
Giả sử chúng ta cần xây dựng một hệ thống các shop bán đồ điện tử.
Và mỗi cửa hàng sẽ được đặt ở một địa điểm riêng.
Tất cả đều xây dựng theo chuẩn module, 1 thiết kế.
Mỗi cửa hàng sẽ có một bản danh sách quản lý thông tin tất cả nhãn hiệu các sản phẩm của mình.
Giả sử khách hàng muốn đến shop tại địa điểm nào đó, hãy show cho họ xem thông tin sản phẩm.
Bài toán trên khi triển khai, sẽ thực hiện áp dụng mẫu design pattern builder.
– Việc xây dựng nhiều cửa hàng với thiết kế 1 module sẽ cho ta thấy việc áp dụng 1 lớp cơ sở trừu tượng, và các lớp con kế thừa.
– Các lớp con kế thừa này chính là các cửa hàng tại mỗi địa điểm. Các lớp con sẽ thực hiện việc tạo sản phẩm, và lưu thông tin về sản phẩm.
– sản phẩm sẽ được một lớp quản lý gọi là lớp sản phẩm, nó chứa đẩy đủ các thông tin cho từng sản phẩm, ví dụ thông tin là tên, sẽ có tên điện thoại, tên tivi, tên máy tính….được lưu bởi các biến.
– Một lớp thứ 3 là lớp đại diện nó thực hiện nhiệm vụ xây dựng shop, và gọi hàm lưu các thông tin về sản phẩm cho shop.
Như vậy chúng ta có :
+ Lớp cơ sở ảo shop.
+ Class kế thừa shop đại diện cho shop từng khu vực.
+ Lớp quản lý các sản phẩm.
+ Class giao diện, thực hiện tạo shop và lưu trữ các thông tin cho sản phẩm, đồng có thể lấy được thông tin sản phẩm khi cần.
2. Sơ đồ UML Cho builder.
Áp dụng cho bài toán thực tế.
3. Thực hành builder pattern với c++.
– Đầu tiên hãy xây dựng lớp sản phẩm chưa các thông tin sản phẩm.
// Phattrienphanmem123az.com #include <iostream> #include <conio.h> #include <string> using namespace std; class ElectronicProduct { private : string phone_; string tablet_; string screen_; string laptop_; string tivi_; public: void set_phone(string phone) { this->phone_ = phone;} void set_tablet(string tablet) { this->tablet_ = tablet;} void set_laptop(string laptop) { this->laptop_ = laptop;} void set_screen(string screen) { this->screen_ = screen;} void set_tivi(string tivi) { this->tivi_ = tivi; } void ShowInfo() { std::cout << phone_.c_str() << std::endl; std::cout << tablet_.c_str() << std::endl; std::cout << screen_.c_str() << std::endl; std::cout << laptop_.c_str() << std::endl; std::cout << tivi_.c_str() << std::endl; } }; //Phattrienphanmem123az.com
– Tiếp theo xây dựng lớp cơ sở builder và các lớp kế thừa.
//Phattrienphanmem123az.com class ShopBuilder { public: virtual void buildPhone()=0; virtual void buildTablet()=0; virtual void buildLaptop()=0; virtual void buildScreen()=0; virtual void buildTivi()=0; virtual ElectronicProduct* get_product()=0; }; class HanoiShop : public ShopBuilder { private: ElectronicProduct *e_product_; public: HanoiShop() { e_product_ = new ElectronicProduct(); } void buildPhone() { e_product_->set_phone("galaxy s5"); } void buildTablet() { e_product_->set_tablet("samsung tab"); } void buildScreen() { e_product_->set_laptop("LG LCD"); } void buildLaptop() { e_product_->set_screen("Asus laptop"); } void buildTivi() { e_product_->set_tivi("LCD Tivi"); } ElectronicProduct* get_product() { return this->e_product_; } }; class HaiPhongShop:public ShopBuilder { private: ElectronicProduct *e_product_; public: HaiPhongShop() { e_product_ = new ElectronicProduct(); } void buildPhone() { e_product_->set_phone("Iphone"); } void buildTablet() { e_product_->set_tablet("Ipad"); } void buildScreen() { e_product_->set_laptop("samsung lcd"); } void buildLaptop() { e_product_->set_screen("Dell laptop"); } void buildTivi() { e_product_->set_tivi("Sony Tivi"); } ElectronicProduct* get_product() { return this->e_product_; } }; //Phattrienphanmem123az.com
– Xây dựng lớp Director tạo các builder và lưu thông tin sản phẩm. Sau đó là sử dụng các đối tượng trong hàm main.
//Phattrienphanmem123az.com class ContractorShop { private: ShopBuilder *shop_builder_; public: ContractorShop(ShopBuilder *houseBuilder) { this->shop_builder_ = houseBuilder; } ElectronicProduct *getProduct() { return shop_builder_->get_product(); } void buildProduct() { shop_builder_->buildPhone(); shop_builder_->buildTablet(); shop_builder_->buildScreen(); shop_builder_->buildLaptop(); shop_builder_->buildTivi(); } }; int main() { ShopBuilder *hanoi_shop = new HanoiShop(); ShopBuilder *haiphong_shop = new HaiPhongShop(); ContractorShop *p_shop1 = new ContractorShop(hanoi_shop); ContractorShop *p_shop2 = new ContractorShop(haiphong_shop); p_shop1->buildProduct(); ElectronicProduct *e_product_1 = p_shop1->getProduct(); p_shop2->buildProduct(); ElectronicProduct *e_product_2 = p_shop2->getProduct(); e_product_1->ShowInfo(); std::cout << "\n\n\n\n"; e_product_2->ShowInfo(); _getch(); // Free pointer. }
Ok. Đó là mẫu thiết kế Builder.
Về cơ bản Build sử dụng một lớp director để xây dựng lên các builder, và các thông tin sản phẩm nằm trong builder.