Ví dụ về Factory Pattern trong PHP
Hướng dẫn về Factory Pattern trong PHP với ví dụ cụ thể giúp bạn hiểu rõ cách sử dụng mẫu thiết kế này trong lập trình hướng đối tượng.
Factory pattern cung cấp một cách để tạo các object mà không cần phải chỉ rõ class chính xác cần được khởi tạo. Điều này giúp mã dễ mở rộng và linh hoạt hơn khi cần tạo nhiều loại object khác nhau.
<?php
// Factory Pattern trong PHP
// Interface cho các loại sản phẩm
interface Product {
public function getType();
}
// Các class sản phẩm cụ thể
class ProductA implements Product {
public function getType() {
return "Sản phẩm A";
}
}
class ProductB implements Product {
public function getType() {
return "Sản phẩm B";
}
}
// Factory để tạo ra các đối tượng sản phẩm
class ProductFactory {
public static function createProduct($type) {
switch ($type) {
case 'A':
return new ProductA();
case 'B':
return new ProductB();
default:
throw new Exception("Loại sản phẩm không tồn tại.");
}
}
}
// Sử dụng Factory để tạo sản phẩm
try {
$productA = ProductFactory::createProduct('A');
echo $productA->getType(); // Output: Sản phẩm A
$productB = ProductFactory::createProduct('B');
echo $productB->getType(); // Output: Sản phẩm B
} catch (Exception $e) {
echo $e->getMessage();
}
?>
Giải thích chi tiết:
-
interface Product
: Đây là interface cho các sản phẩm mà factory sẽ tạo ra. Mỗi sản phẩm sẽ cần có phương thứcgetType()
. -
class ProductA
vàclass ProductB
: Đây là các class cụ thể đại diện cho các loại sản phẩm khác nhau. Cả hai class đều triển khai phương thứcgetType()
để trả về loại sản phẩm của mình. -
class ProductFactory
: Đây là class factory, chứa phương thứccreateProduct($type)
để tạo đối tượng dựa trên tham số$type
. Nếu$type
là 'A', nó sẽ tạo và trả về đối tượng củaProductA
, nếu là 'B' thì tạoProductB
. -
ProductFactory::createProduct('A')
: Khi gọi phương thức này, nó sẽ tạo ra một đối tượng củaProductA
. -
catch (Exception $e)
: Đoạn mã này xử lý lỗi nếu$type
không hợp lệ và không có sản phẩm tương ứng.
Phiên bản PHP:
Mã này tương thích với PHP 5.0 trở lên.