Design Pattern: Prototype

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: Prototype Design Pattern

1. Bài toán ví dụ thực tế cho mẫu Prototype Pattern.

Một nhà máy sản xuất các sản phẩm điện tử bao gồm điện thoại và máy tính bảng.

Khách hàng muốn đến nhà máy để xem các mẫu sản phẩm đã được sản xuất.

Nhà máy yêu cầu các bộ phận quản lý lấy ra một mẫu sao lưu chuyên cho việc test và demo.

Vậy thì khi triển khai bài toán trên, người ta sẽ áp dụng mẫu prototype để xây dựng mô hình.

– Một lớp cơ sở trừu tượng đại diện cho sản phẩm. Có 1 hàm sao lưu gọi là hàm clone (dạng hàm thuần ảo virtual pure)

– Hai lớp sản phẩm con kế thừa từ lớp sản phẩm, và chúng sẽ định nghĩa hàm clone để tự sao lưu bản thân chúng.

– Một lớp giao diện gọi là lớp handle thực hiện việc quản lý các sản phẩm, giao tiếp với khách hàng, và thực hiện chức gọi các hàm sao lưu sản phẩm.

2. Xây dựng sơ đồ UML cho Prototype.

3. Triển khai mẫu prototype với code c++

– Xây dựng lớp sản phẩm cơ sở, và 2 lớp sản phẩm kế thừa.

//Phát Triển Phần Mềm 123az
#include <iostream>
#include <vector>
#include <conio.h>

using namespace std;

class EProducts 
{
public:
  virtual EProducts* clone() = 0;
  virtual void ShowName() = 0;
};


class Phone : public EProducts 
{
public:
  EProducts*   clone() 
  { 
    return new Phone; 
  }

  void ShowName() 
  {
    cout << "This is Phone\n"; 
  }
};

class Tablet : public EProducts 
{
public:
  EProducts*   clone() 
  { 
    return new Tablet; 
  }

  void ShowName() 
  {
    cout << "This is tablet\n"; 
  }
};

– Xây dựng lớp client: Factory, test thử trong hàm main.

//Phát Triển Phần Mềm 123az
class Factory 
{
public:
  static EProducts* make_product(int type);
private:
  static EProducts* s_prototypes[2];
};

EProducts* Factory::s_prototypes[] = {new Phone, new Tablet};


EProducts* Factory::make_product(int choice) 
{
  return s_prototypes[choice]->clone();
}


int main() 
{
  vector<EProducts*> product_list;

  // lay product thong qua viec clone trong factory
  product_list.push_back(Factory::make_product(0));  
  product_list.push_back(Factory::make_product(1));

  // show thong tin
  for (int i= 0; i < product_list.size(); ++i)
  {
    product_list[i]->ShowName();
  }


  //Free
  for (int i=0; i < product_list.size(); ++i)
    delete product_list[i];
  product_list.clear();

  _getch();
}

 

Về cơ bản, mẫu prototype là việc nhân bản ra một đối tượng mới từ 1 đối tượng có sẵn.

Nghĩa là factory (client) luôn có một đối tượng mẫu sẵn có. Và mỗi lần cần tạo mối đối tượng mới, chúng ta không sử new object như thông thường.

Mà sẽ dùng factory để sao lưu một bản mới từ đối tượng mẫu sẵn có ở trên. Đó là Prototype Design Pattern.

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.