Factory Pattern (Nhóm khởi tạo)
Mẫu thiết kế khởi tạo cung cấp một giao diện để tạo các đối tượng trong lớp cha, nhưng cho phép các lớp con thay đổi loại đối tượng sẽ được tạo ra. Mục đích chính: giảm sự phụ thuộc giữa code và lớp cụ thể → dễ mở rộng và bảo trì.
Mục tiêu chung của nhóm khởi tạo: “kéo” việc khởi tạo trực tiếp đối tượng ra thành một class riêng biệt → thay thế đối tượng linh hoạt hơn, đảm bảo các nguyên tắc SOLID.
🔍 Dấu hiệu nhận biết
Cần khởi tạo nhiều loại đối tượng khác nhau mà không cần biết chính xác đối tượng nào sẽ được khởi tạo. Ví dụ: phương thức vận chuyển cho website TMĐT - gửi hàng qua GHTK, GHN, ViettelPost… Factory đóng vai trò khởi tạo đối tượng tương ứng của từng phương thức.
Ví dụ
<?php
class Dog {
public function speak() { return "Gâu gâu"; }
}
class Cat {
public function speak() { return "Meo meo"; }
}
class AnimalFactory {
// Tạo đối tượng Animal dựa trên loại (type)
public function createAnimal($type) {
switch ($type) {
case 'dog': return new Dog();
case 'cat': return new Cat();
default: throw new Exception("Invalid animal type");
}
}
}
$factory = new AnimalFactory();
echo $factory->createAnimal('dog')->speak(); // Gâu gâu
echo $factory->createAnimal('cat')->speak(); // Meo meoChú ý của tác giả: sách không đi sâu vào 2 pattern riêng biệt Factory Method và Abstract Factory (vì tính tương tự nhau) - đây là cách đơn giản hơn để áp dụng Factory.
Liên quan
- Builder Pattern, Singleton Pattern - cùng nhóm khởi tạo
- Liskov Substitution Principle - ví dụ CarFactory/ShipFactory vi phạm LSP
- Strategy Pattern - thường kết hợp: factory tạo strategy tương ứng