1. چیستی الگوی Prototype

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

2. ویژگی‌ها و مزایای الگوی Prototype

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

3. صحنه‌های کاربردی الگوی Prototype در Golang

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

  • زمانی که ایجاد اشیاء پیچیده است، اما ایجاد اشیاء با کپی کردن اشیاء موجود کارآمدتر باشد.
  • هنگامی که نیاز به ایجاد یا کلون اشیاء به صورت پویا وجود دارد، به جای ایجاد مستقیم نمونه‌های جدید اشیاء.

4. پیاده‌سازی الگوی Prototype در Golang

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

Golang Prototype Pattern

4.2. مرحله پیاده‌سازی 1: ایجاد یک رابط Prototype

ابتدا یک رابط prototype ایجاد کنید که متد clone را تعریف می‌کند.

type Prototype interface {
	clone() Prototype
}

4.3. مرحله پیاده‌سازی 2: ایجاد و کلون اشیاء با استفاده از رابط Prototype

4.3.1. ایجاد یک کلاس Manager Prototype

کلاس manager prototype مسئول ایجاد و مدیریت اشیاء prototype است.

type PrototypeManager struct {
	prototypes map[string]Prototype
}

func NewPrototypeManager() *PrototypeManager {
	return &PrototypeManager{
		prototypes: make(map[string]Prototype),
	}
}

func (pm *PrototypeManager) Register(name string, prototype Prototype) {
	pm.prototypes[name] = prototype
}

func (pm *PrototypeManager) Unregister(name string) {
	delete(pm.prototypes, name)
}

func (pm *PrototypeManager) Clone(name string) Prototype {
	prototype, ok := pm.prototypes[name]
	if ok {
		return prototype.clone()
	}
	return nil
}

4.3.2. ایجاد و کلون اشیاء با استفاده از کلاس Manager Prototype

type Product struct {
	name string
}

func (p *Product) clone() Prototype {
	return &Product{
		name: p.name,
	}
}

func main() {
	manager := NewPrototypeManager()

// ثبت اشیاء نمونه در کلاس manager prototype
manager.Register("productA", &Product{name: "محصول A"})

// ایجاد و کلون اشیاء با استفاده از کلاس manager prototype
productA := manager.Clone("productA").(*Product)
fmt.Println(productA.name) // خروجی: محصول A
}

4.4. مرحله پیاده‌سازی 3: ملاحظات و بهترین روش‌ها برای استفاده از الگوی Prototype

در استفاده از الگوی prototype، باید به نکات زیر توجه داشت:

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