1. Factory Method Pattern là gì
Factory Method Pattern là một mẫu thiết kế sáng tạo cung cấp một cách để đóng gói quá trình tạo đối tượng trong các lớp con. Điều này giúp khách hàng có thể tạo đối tượng bằng cách gọi phương thức nhà máy mà không cần lo lắng về quá trình tạo đối tượng cụ thể.
2. Đặc điểm và Ưu điểm của Factory Method Pattern
Các đặc điểm của Factory Method Pattern bao gồm:
- Tách biệt quá trình tạo và sử dụng đối tượng, nơi mà khách hàng chỉ cần quan tâm đến phương thức nhà máy và giao diện sản phẩm trừu tượng.
- Hệ thống có thể được mở rộng bằng cách thêm các lớp nhà máy cụ thể mới và các lớp sản phẩm cụ thể mới, tuân theo Nguyên lý Mở/Đóng.
Các ưu điểm của Factory Method Pattern bao gồm:
- Đóng gói quá trình tạo đối tượng, làm cho hệ thống linh hoạt và có thể mở rộng hơn.
- Ẩn các chi tiết triển khai của các lớp sản phẩm cụ thể, giảm sự phụ thuộc và ghép nối của khách hàng vào các lớp cụ thể.
- Cung cấp một cách tiêu chuẩn để tạo ra các sản phẩm, dễ dàng trong việc bảo trì và mở rộng hệ thống.
3. Các Kịch bản Ứng dụng của Factory Method Pattern
Factory Method Pattern phù hợp với các tình huống sau:
- Khách hàng không phụ thuộc vào các lớp sản phẩm cụ thể, mà phụ thuộc vào giao diện sản phẩm trừu tượng.
- Khách hàng cần tạo động các đối tượng sản phẩm khác nhau dựa trên các điều kiện khác nhau.
- Cần đóng gói và ẩn quá trình tạo đối tượng sản phẩm.
4. Triển khai Factory Method Pattern trong Golang
4.1 Sơ đồ Lớp UML
4.2 Bước Triển khai 1: Xác định Giao diện Sản phẩm Trừu tượng
package factory
// Product là giao diện sản phẩm trừu tượng
type Product interface {
Operation() string
}
4.3 Bước Triển khai 2: Tạo các Lớp Triển khai Sản phẩm Cụ thể
package factory
// ConcreteProductA là lớp sản phẩm cụ thể A
type ConcreteProductA struct{}
// Operation là phương thức của lớp sản phẩm cụ thể A
func (p *ConcreteProductA) Operation() string {
return "ConcreteProductA"
}
// ConcreteProductB là lớp sản phẩm cụ thể B
type ConcreteProductB struct{}
// Operation là phương thức của lớp sản phẩm cụ thể B
func (p *ConcreteProductB) Operation() string {
return "ConcreteProductB"
}
4.4 Bước Triển khai 3: Xác định Giao diện Nhà máy Trừu tượng
package factory
// Factory là giao diện nhà máy trừu tượng
type Factory interface {
CreateProduct() Product
}
4.5 Bước Triển khai 4: Tạo các Lớp Triển khai Nhà máy Cụ thể
package factory
// ConcreteFactoryA là lớp nhà máy cụ thể A
type ConcreteFactoryA struct{}
// CreateProduct là phương thức của lớp nhà máy cụ thể A
func (f *ConcreteFactoryA) CreateProduct() Product {
return &ConcreteProductA{}
}
// ConcreteFactoryB là lớp nhà máy cụ thể B
type ConcreteFactoryB struct{}
// CreateProduct là phương thức của lớp nhà máy cụ thể B
func (f *ConcreteFactoryB) CreateProduct() Product {
return &ConcreteProductB{}
}
4.6 Bước Triển khai 5: Khách hàng Gọi Phương thức Nhà máy để Tạo Đối tượng Sản phẩm
package main
import (
"fmt"
"github.com/your/package/factory"
)
func main() {
// Tạo Nhà máy Cụ thể A
nhaMayA := &factory.ConcreteFactoryA{}
// Gọi phương thức nhà máy để tạo đối tượng sản phẩm
sanPhamA := nhaMayA.CreateProduct()
fmt.Println(sanPhamA.Operation())
// Tạo Nhà máy Cụ thể B
nhaMayB := &factory.ConcreteFactoryB{}
// Gọi phương thức nhà máy để tạo đối tượng sản phẩm
sanPhamB := nhaMayB.CreateProduct()
fmt.Println(sanPhamB.Operation())
}
Trong đoạn mã trên, chúng tôi xác định giao diện sản phẩm trừu tượng Product
và các lớp sản phẩm cụ thể ConcreteProductA
và ConcreteProductB
. Sau đó, chúng tôi xác định giao diện nhà máy trừu tượng Factory
và các lớp nhà máy cụ thể ConcreteFactoryA
và ConcreteFactoryB
. Khách hàng có thể tạo ra các đối tượng sản phẩm cụ thể bằng cách gọi phương thức của lớp nhà máy cụ thể, từ đó triển khai mẫu Factory Method.
Với các bước trên, chúng ta đã hoàn thành việc triển khai mẫu Factory Method trong Golang. Phương pháp này tách biệt khách hàng khỏi các lớp sản phẩm cụ thể, cho phép khách hàng tập trung chỉ vào giao diện sản phẩm trừu tượng. Đồng thời, chi tiết triển khai của các lớp sản phẩm cụ thể được đóng gói trong lớp nhà máy cụ thể, làm cho hệ thống linh hoạt và mở rộng hơn. Mẫu Factory Method rất phổ biến trong ứng dụng thực tế, đặc biệt là các tình huống cần tạo động các loại đối tượng khác nhau, hiệu quả nâng cao khả năng tái sử dụng mã và khả năng bảo trì.