Phân biệt Factory Method và Abstract Factory trong Design Pattern
Câu chuyện minh họa để phân biệt Factory Method và Abstract Factory
Tình huống câu chuyện: Cửa hàng bán đồ nội thất
Giả sử bạn là chủ một cửa hàng bán đồ nội thất, nơi bạn cung cấp hai dòng sản phẩm: Nội thất cổ điển và Nội thất hiện đại. Mỗi dòng sản phẩm bao gồm ghế, bàn, và tủ. Bạn muốn quản lý việc sản xuất những món đồ này sao cho:
- Cách sản xuất từng loại sản phẩm cụ thể (như ghế cổ điển hoặc ghế hiện đại) có thể tùy chỉnh.
- Đảm bảo mỗi bộ nội thất (ghế, bàn, tủ) thuộc cùng một phong cách (cổ điển hoặc hiện đại).
1. Sử dụng Factory Method
- Mô tả: Bạn muốn tập trung vào việc sản xuất một sản phẩm cụ thể, ví dụ: ghế.
- Cách hoạt động:
- Bạn tạo một lớp cơ sở (abstract class hoặc interface) cho các loại ghế (
Chair
), và các lớp con sẽ quyết định cách sản xuấtClassicChair
hoặcModernChair
. - Mỗi phong cách ghế sẽ có một nhà máy (factory) riêng.
- Bạn tạo một lớp cơ sở (abstract class hoặc interface) cho các loại ghế (
Cách triển khai trong câu chuyện:
-
Bạn có lớp cơ sở
ChairFactory
:abstract class ChairFactory {abstract fun createChair(): Chair} -
Các nhà máy cụ thể:
class ClassicChairFactory : ChairFactory() {override fun createChair(): Chair {return ClassicChair()}}class ModernChairFactory : ChairFactory() {override fun createChair(): Chair {return ModernChair()}} -
Khách hàng chọn nhà máy:
- Nếu khách muốn ghế cổ điển, họ chọn
ClassicChairFactory
. - Nếu khách muốn ghế hiện đại, họ chọn
ModernChairFactory
.
- Nếu khách muốn ghế cổ điển, họ chọn
2. Sử dụng Abstract Factory
- Mô tả: Bạn muốn sản xuất một bộ sản phẩm hoàn chỉnh (bao gồm ghế, bàn, và tủ) theo phong cách.
- Cách hoạt động:
- Bạn tạo một lớp cơ sở
FurnitureFactory
để sản xuất toàn bộ sản phẩm. - Mỗi dòng sản phẩm (cổ điển hoặc hiện đại) sẽ có một nhà máy riêng để đảm bảo tính đồng nhất.
- Bạn tạo một lớp cơ sở
Cách triển khai trong câu chuyện:
-
Bạn có lớp cơ sở
FurnitureFactory
:interface FurnitureFactory {fun createChair(): Chairfun createTable(): Tablefun createCabinet(): Cabinet} -
Các nhà máy cụ thể:
class ClassicFurnitureFactory : FurnitureFactory {override fun createChair(): Chair {return ClassicChair()}override fun createTable(): Table {return ClassicTable()}override fun createCabinet(): Cabinet {return ClassicCabinet()}}class ModernFurnitureFactory : FurnitureFactory {override fun createChair(): Chair {return ModernChair()}override fun createTable(): Table {return ModernTable()}override fun createCabinet(): Cabinet {return ModernCabinet()}} -
Khách hàng chọn nhà máy:
- Nếu khách muốn bộ nội thất cổ điển, họ chọn
ClassicFurnitureFactory
. - Nếu khách muốn bộ nội thất hiện đại, họ chọn
ModernFurnitureFactory
.
- Nếu khách muốn bộ nội thất cổ điển, họ chọn
So sánh qua câu chuyện
Đặc điểm | Factory Method | Abstract Factory |
---|---|---|
Phạm vi | Tập trung vào sản xuất một loại sản phẩm cụ thể (như ghế). | Tập trung vào sản xuất một họ sản phẩm liên quan (ghế, bàn, tủ đồng bộ). |
Tính đồng bộ | Không đảm bảo các sản phẩm khác thuộc cùng phong cách. | Đảm bảo tất cả sản phẩm trong bộ thuộc cùng một phong cách. |
Ứng dụng | Khách chỉ cần ghế, và chọn kiểu ghế họ muốn. | Khách cần bộ nội thất hoàn chỉnh theo phong cách (cổ điển hoặc hiện đại). |
Độ phức tạp | Ít phức tạp hơn, phù hợp cho từng sản phẩm riêng lẻ. | Phức tạp hơn, nhưng đồng bộ hóa sản xuất toàn bộ các sản phẩm trong một họ. |
Tóm lại:
- Factory Method: Thích hợp khi cần sản xuất một sản phẩm cụ thể với các biến thể khác nhau.
- Abstract Factory: Thích hợp khi cần sản xuất nhiều sản phẩm liên quan để tạo thành một hệ thống hoặc bộ sản phẩm đồng nhất.
Nhận xét
Đăng nhận xét