Hướng dẫn cách áp dụng Design Pattern Prototype bằng từ khóa clone trong PHP với ví dụ thực tế
Prototype Design Pattern là một mẫu thiết kế sáng tạo (Creational Design Pattern) cho phép bạn tạo ra các đối tượng mới bằng cách sao chép (clone) một đối tượng có sẵn thay vì khởi tạo lại từ đầu (new).
Trong PHP, mẫu thiết kế này được hỗ trợ hoàn toàn tự nhiên nhờ từ khóa clone và phương thức ma thuật __clone().
Khi nào nên dùng Prototype Pattern?
-
Khi việc khởi tạo một đối tượng tốn nhiều chi phí (ví dụ: truy vấn CSDL phức tạp, gọi API bên ngoài, hoặc nạp cấu hình nặng).
-
Khi bạn muốn tạo ra các đối tượng gần giống nhau, chỉ thay đổi một vài thuộc tính nhỏ mà không muốn lặp lại code khởi tạo.
Ví dụ thực tế: Hệ thống tạo báo cáo tự động
Giả sử hệ thống của bạn cần xuất các loại báo cáo khác nhau (Marketing, IT, Tài chính). Tất cả đều dùng chung một bộ khung chuẩn và quyền hạn, chỉ khác tiêu đề và nội dung chi tiết.
1. Định nghĩa lớp đối tượng (Prototype)
PHP
class Report implements \Cloneable { // Hoặc định nghĩa Interface tùy ý
public string $title;
public string $content;
public array $permissions; // Thuộc tính dạng mảng cần xử lý đặc biệt
public function __construct(string $title, string $content, array $permissions) {
$this->title = $title;
$this->content = $content;
$this->permissions = $permissions;
}
/**
* Phương thức __clone giúp xử lý Deep Copy cho các mảng/đối tượng bên trong.
*/
public function __clone() {
// Sao chép sâu mảng permissions để bản clone không bị dính tham chiếu với bản gốc
$this->permissions = array_map(fn($item) => $item, $this->permissions);
}
public function display(): void {
echo "Tiêu đề: {$this->title}\n";
echo "Nội dung: {$this->content}\n";
echo "Quyền: " . implode(', ', $this->permissions) . "\n\n";
}
}
2. Sử dụng Prototype để sinh đối tượng linh hoạt
PHP
// Bước 1: Tạo bản nguyên mẫu (Master Prototype) - Mô phỏng việc tốn tài nguyên khởi tạo
$masterReport = new Report(
'Báo cáo gốc chuẩn',
'Nội dung mặc định của toàn doanh nghiệp...',
['view', 'print']
);
// Bước 2: Clone ra báo cáo cho phòng Marketing và tùy chỉnh
$marketingReport = clone $masterReport;
$marketingReport->title = 'Báo cáo Hiệu suất Marketing Q2';
$marketingReport->content = 'Số liệu chiến dịch Facebook & Google Ads...';
// Thêm quyền riêng cho Marketing
$marketingReport->permissions[] = 'export_excel';
// Bước 3: Clone ra báo cáo cho phòng IT
$itReport = clone $masterReport;
$itReport->title = 'Báo cáo Sự cố Hạ tầng IT';
$itReport->content = 'Danh sách lỗi server và giải pháp...';
// Kiểm tra kết quả
$marketingReport->display();
$itReport->display();
Ưu điểm vượt trội của Prototype Pattern
-
Hiệu suất cao: Tránh được việc thực hiện lại các câu lệnh
newnặng nề hoặc gọi lại các truy vấn tốn kém từ Database. -
Giảm thiểu code trùng lặp: Không cần viết lại các logic khởi tạo phức tạp cho từng đối tượng có chung đặc điểm.
-
Linh hoạt: Cho phép thêm/bớt các biến thể đối tượng ngay tại thời điểm chạy (runtime) một cách dễ dàng.
All rights reserved