Factory Pattern & Singleton Pattern Trong Python: Hướng Dẫn Chi Tiết
Sau khi tìm hiểu về MVC, chúng ta tiếp tục với Factory Pattern và Singleton Pattern – hai mẫu thiết kế phổ biến trong lập trình hướng đối tượng (OOP).
📌 Nội dung chính:
1️⃣ Factory Pattern là gì?
2️⃣ Cách triển khai Factory Pattern trong Python
3️⃣ Singleton Pattern là gì?
4️⃣ Cách triển khai Singleton Pattern trong Python
5️⃣ So sánh Factory và Singleton
1. Factory Pattern Là Gì?
Factory Pattern (Mẫu thiết kế nhà máy) là một mẫu thiết kế tạo đối tượng mà không cần chỉ định lớp cụ thể. Nó giúp:
✔️ Ẩn đi logic khởi tạo phức tạp
✔️ Linh hoạt mở rộng – dễ thêm đối tượng mới mà không sửa đổi code cũ
✔️ Tăng tính đóng gói – người dùng chỉ cần gọi Factory thay vì tạo trực tiếp
2. Cách Triển Khai Factory Pattern Trong Python
💡 Ví dụ: Ta có một hệ thống tạo ra các loại động vật khác nhau (Chó, Mèo).
Bước 1: Tạo các lớp đối tượng
class Dog:
def speak(self):
return "Gâu gâu!"
class Cat:
def speak(self):
return "Meo meo!"
Bước 2: Tạo Factory
class AnimalFactory:
@staticmethod
def get_animal(animal_type):
animals = {
"dog": Dog(),
"cat": Cat()
}
return animals.get(animal_type.lower(), None)
Bước 3: Sử Dụng Factory
if __name__ == "__main__":
animal = AnimalFactory.get_animal("dog")
if animal:
print(animal.speak()) # Output: Gâu gâu!
animal = AnimalFactory.get_animal("cat")
if animal:
print(animal.speak()) # Output: Meo meo!
💡 Lợi ích:
✔ Tách biệt logic tạo đối tượng
✔ Dễ dàng mở rộng – chỉ cần thêm vào Factory
3. Singleton Pattern Là Gì?
Singleton Pattern (Mẫu thiết kế đơn nhất) đảm bảo chỉ có một thể hiện (instance) duy nhất của lớp được tạo ra.
✔️ Tránh lãng phí bộ nhớ
✔️ Dùng trong quản lý tài nguyên hệ thống (database, config, logger,…)
4. Cách Triển Khai Singleton Pattern Trong Python
Cách 1: Dùng Biến Lớp
class Singleton:
_instance = None # Biến lớp lưu instance duy nhất
def __new__(cls):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
Cách 2: Dùng Decorator
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class Config:
def __init__(self):
self.data = "Cấu hình hệ thống"
config1 = Config()
config2 = Config()
print(config1 is config2) # Output: True (Cùng một instance)
5. So Sánh Factory Pattern Và Singleton Pattern
| Tiêu chí | Factory Pattern | Singleton Pattern |
|---|---|---|
| Mục đích | Tạo đối tượng mà không cần chỉ định lớp cụ thể | Đảm bảo chỉ có một instance duy nhất |
| Linh hoạt | Dễ mở rộng (thêm lớp mới vào Factory) | Không linh hoạt (chỉ có một instance) |
| Ứng dụng | Khi cần tạo nhiều loại đối tượng | Khi cần quản lý tài nguyên hệ thống (Database, Logger,…) |
6. Khi Nào Sử Dụng Factory Và Singleton?
✅ Dùng Factory Pattern khi:
- Cần tạo nhiều loại đối tượng mà không cần biết trước lớp cụ thể
- Muốn đơn giản hóa quá trình khởi tạo
✅ Dùng Singleton Pattern khi:
- Cần quản lý một đối tượng duy nhất trong toàn bộ ứng dụng (VD: Database, Config, Logger)
📌 Ví dụ thực tế:
- Factory Pattern dùng trong ORM (SQLAlchemy, Django ORM) để tạo nhiều loại model khác nhau.
- Singleton Pattern dùng để quản lý connection database trong hệ thống lớn.
7. Tổng Kết
✔ Factory Pattern – tạo đối tượng linh hoạt, dễ mở rộng.
✔ Singleton Pattern – đảm bảo chỉ có một instance duy nhất.
✔ Hiểu rõ ứng dụng để sử dụng đúng trong dự án thực tế.
💡 Bạn có câu hỏi gì về Factory hoặc Singleton? Hãy để lại bình luận bên dưới!