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ểnNộ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:

  1. 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.
  2. Đả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ất ClassicChair hoặc ModernChair.
    • Mỗi phong cách ghế sẽ có một nhà máy (factory) riêng.

Cách triển khai trong câu chuyện:

  1. Bạn có lớp cơ sở ChairFactory:

    abstract class ChairFactory {
    abstract fun createChair(): Chair
    }
  2. 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()
    }
    }
  3. 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.

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.

Cách triển khai trong câu chuyện:

  1. Bạn có lớp cơ sở FurnitureFactory:

    interface FurnitureFactory {
    fun createChair(): Chair
    fun createTable(): Table
    fun createCabinet(): Cabinet
    }
  2. 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()
    }
    }
  3. 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.

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

Bài đăng phổ biến từ blog này

Tài liệu Clickermann - by Mai Bao Long

Code mẫu tự động phát hiện và lock window screen

Code trái tim