1. چیست الگوی متد کارخانه (Factory Method)؟

الگوی متد کارخانه یک الگوی طراحی خلقی است که روشی برای محافظت از فرآیند ایجاد اشیاء در زیرکلاس‌ها فراهم می‌کند. به این ترتیب، مشتری می‌تواند با فراخوانی متد کارخانه، اشیاء را بدون نگرانی از فرآیند خلق اشیاء خاص ایجاد کند.

2. ویژگی‌ها و مزایای الگوی متد کارخانه

ویژگی‌های الگوی متد کارخانه شامل:

  • جداسازی خلق و استفاده از اشیاء، جایی که مشتری تنها نیاز به اهمیت دادن به متد کارخانه و رابط محصول انتزاعی دارد.
  • سیستم می‌تواند با افزودن کلاس‌های کارخانه خاص و کلاس‌های محصول خاص، با اصول Open/Closed سازگار شود.

مزایای الگوی متد کارخانه عبارتند از:

  • محافظت از فرآیند ایجاد اشیاء، سیستم را انعطاف‌پذیر و قابل گسترش می‌کند.
  • مخفی کردن جزئیات پیاده‌سازی کلاس‌های محصول خاص، وابستگی و اتصال مشتری به کلاس‌های خاص را کاهش می‌دهد.
  • فراهم کردن یک روش استاندارد برای ایجاد محصولات، که نگهداری و گسترش سیستم را آسان می‌کند.

3. صحنه‌های کاربردی الگوی متد کارخانه

الگوی متد کارخانه برای صحنه‌های زیر مناسب است:

  • مشتری وابسته به کلاس‌های محصول خاص نیست، بلکه وابستگی به رابط محصول انتزاعی دارد.
  • مشتری نیاز دارد که براساس شرایط مختلف، به صورت پویا اشیاء محصول مختلف ایجاد کند.
  • نیاز به بسته‌بندی و پنهان کردن فرآیند ایجاد اشیاء محصول وجود دارد.

4. پیاده‌سازی الگوی متد کارخانه در Golang

4.1 نمودار کلاس UML

الگوی متد کارخانه در Golang

4.2 گام پیاده‌سازی 1: تعریف رابط محصول انتزاعی

package factory

// Product رابط محصول انتزاعی است
type Product interface {
	Operation() string
}

4.3 گام پیاده‌سازی 2: ایجاد کلاس‌های پیاده‌سازی محصول خاص

package factory

// ConcreteProductA کلاس محصول خاص A است
type ConcreteProductA struct{}

// Operation متد کلاس محصول خاص A است
func (p *ConcreteProductA) Operation() string {
	return "ConcreteProductA"
}

// ConcreteProductB کلاس محصول خاص B است
type ConcreteProductB struct{}

// Operation متد کلاس محصول خاص B است
func (p *ConcreteProductB) Operation() string {
	return "ConcreteProductB"
}

4.4 گام پیاده‌سازی 3: تعریف رابط کارخانه انتزاعی

package factory

// Factory رابط کارخانه انتزاعی است
type Factory interface {
	CreateProduct() Product
}

4.5 گام پیاده‌سازی 4: ایجاد کلاس‌های پیاده‌سازی کارخانه خاص

package factory

// ConcreteFactoryA کلاس کارخانه خاص A است
type ConcreteFactoryA struct{}

// CreateProduct متد کلاس کارخانه خاص A است
func (f *ConcreteFactoryA) CreateProduct() Product {
	return &ConcreteProductA{}
}

// ConcreteFactoryB کلاس کارخانه خاص B است
type ConcreteFactoryB struct{}

// CreateProduct متد کلاس کارخانه خاص B است
func (f *ConcreteFactoryB) CreateProduct() Product {
	return &ConcreteProductB{}
}

4.6 گام پیاده‌سازی 5: مشتری متد کارخانه را صدا می‌زند تا اشیاء محصول ایجاد شود

package main

import (
	"fmt"
	"github.com/your/package/factory"
)

func main() {
	// ایجاد کارخانه خاص A
	factoryA := &factory.ConcreteFactoryA{}
	// فراخوانی متد کارخانه برای ایجاد اشیاء محصول
	productA := factoryA.CreateProduct()
	fmt.Println(productA.Operation())

	// ایجاد کارخانه خاص B
	factoryB := &factory.ConcreteFactoryB{}
	// فراخوانی متد کارخانه برای ایجاد اشیاء محصول
	productB := factoryB.CreateProduct()
	fmt.Println(productB.Operation())
}

در کد فوق، ما رابط محصول انتزاعی Product و کلاس‌های محصول خاص ConcreteProductA و ConcreteProductB را تعریف می‌کنیم. سپس، رابط کارخانه انتزاعی Factory و کلاس‌های کارخانه خاص ConcreteFactoryA و ConcreteFactoryB را تعریف می‌کنیم. مشتری می‌تواند با فراخوانی متد کارخانه کلاس کارخانه خاص، اشیاء محصول خاص را ایجاد کند، بنابراین الگوی متد کارخانه پیاده‌سازی می‌شود.

با گام‌های فوق، ما پیاده‌سازی الگوی متد کارخانه در Golang را تکمیل کرده‌ایم. این روش مشتری را از کلاس‌های محصول خاص جدا می‌کند و اجازه می‌دهد تا مشتری تنها بر روی رابط محصول انتزاعی تمرکز کند. در عین حال، جزئیات پیاده‌سازی کلاس‌های محصول خاص در کلاس کارخانه خاص مخفی می‌شود، که سیستم را انعطاف‌پذیر و گسترش‌پذیرتر می‌کند. الگوی متد کارخانه در کاربردهای عملی بسیار شایع است، به ویژه در صحنه‌هایی که نیاز به ایجاد پویا انواع مختلف اشیا است، باعث افزایش قابلیت استفاده مجدد و قابلیت نگهداری کد به طور موثری می‌شود.