Design Pattern: Factory Method
Chào mừng các bạn đến với chủ đề Design Pattern
Chúng ta sẽ tìm hiểu về một pattern tiếp theo trong nhóm creational pattern:
Factory Method Pattern.
1. Cơ chế của Factory Method.
+ Giả sử muốn tạo các đối tượng lớp A1 và lớp A2 đều kế thừa từ lớp A.
Người ta sẽ xây dựng một lớp C và trong lớp C sẽ tạo một phương thức khởi tạo
các đối tượng A1 và A2 và trả về đối tượng chung là của lớp A.
+ C là một lớp giao diện, và thông qua C để khởi tạo ra A1 và A2.
+ Factory Method có điểm giống vời Abstract Factory, chỉ khác nó là ít hơn một cấp so với Abstract Factory.
Ví dụ cho thực tế:
Cũng vẫn bài toán cửa hàng bán đồ điện tử.
Abstract Factory sẽ dùng khi shop bán sản phẩm của nhiều nhà sản xuất như sam sung, apple…
Nhưng nếu trong trường hợp shop chỉ bán sản phẩm của 1 nhà sản xuất là sam sung.
=> Thì áp dụng factory method sẽ hợp lý hơn.
Bài toán như sau:
+ Một đại lý của sam sung kinh doanh điện thoại và máy tính bảng (chỉ của sam sung)
+ Khách hàng đến cửa hàng và muốn xem thông tin của tất cả các sản phẩm cửa hàng đang có.
+ Vậy thì khách hàng vốn không có sản phẩm nào, và cửa hàng phải có sản phẩm và show các thông tin cho họ xem.
2. Sơ đồ UML abstract Factory.
Áp dụng cho bài toán cửa hàng bán đồ điện tử.
3. Code c++ minh họa cho factory method.
Khi bài toán phức tạp hơn, thì có thể áp dụng theo sơ đồ trên.
Còn trong các bài toán đơn giản tôi có thể sử dụng luôn phương thức GetProduct
trong lớp Creator mà không cần khai báo thêm một lớp kế thừa nó.
a. Xây dựng lớp cơ sở EProducts: và hai lớp kế thừa là sản phẩm: Phone và Tablet
//Phattrienphanmem123az.com #include <string> #include <iostream> #include <conio.h> #include <vector> class EProducts { public: virtual void ShowName() = 0; }; class Phone: public EProducts { public: void ShowName() { std::cout << "This is a phone"<<std::endl; } }; class Tablet : public EProducts { public: void ShowName() { std::cout << "This is a tablet"<< std::endl; } };
b. Xây dựng lớp interface, tạo các sản phẩm.
class CreateProduct { public: enum TypeProduct { PHONE = 0, TABLET = 1, }; EProducts* GetProduct (int type) { if (type == PHONE) { return new Phone; } else if (type = TABLET) { return new Tablet; } return NULL; } };
c. Xây dựng lớp cửa hàng, chứa và quản lý các sản phẩm.
class ShopProduct { public: ShopProduct() {;} void AddProduct(EProducts* product) { product_list.push_back(product); } std::vector<EProducts*> get_product () {return product_list;} private: std::vector<EProducts*> product_list; };
d. Khởi tạo xây dựng cửa hàng và test show sản phẩm cửa hàng trong hàm main
void main() { //Create product: phone, tablet CreateProduct* p_shop = new CreateProduct(); EProducts* phone = p_shop->GetProduct(CreateProduct::PHONE); EProducts* tablet = p_shop->GetProduct(CreateProduct::TABLET); // Add product for shop ShopProduct shop_product; shop_product.AddProduct(phone); shop_product.AddProduct(tablet); // Show product information of shop std::vector<EProducts*> list_product = shop_product.get_product(); for (int i = 0; i < list_product.size(); i++) { EProducts* product = list_product.at(i); product->ShowName(); } _getch(); return; }
Khi gặp bài toán tương tự như bài toán cửa hàng bán sản phẩm ở trên, các bạn có thể áp dụng factory method.
Ok. Đó là mẫu factory method design pattern.