١. ما هو نمط الطراز المصنعي

نمط الطراز المصنعي هو نمط تصميم إنشاءي يوفر وسيلة لتجميع عملية إنشاء الكائن في الفصل الفرعي. وبهذه الطريقة، يمكن للعميل إنشاء الكائنات عن طريق استدعاء طريقة المصنع دون القلق بشأن عملية إنشاء الكائن المحددة.

٢. السمات والمزايا لنمط الطراز المصنعي

تشمل سمات نمط الطراز المصنعي:

  • فك تجزئة عملية إنشاء الكائنات واستخدامها، حيث يحتاج العميل فقط إلى الاهتمام بطريقة المصنع وواجهة المنتج المجردة.
  • يمكن توسيع النظام عن طريق إضافة فئات مصنع محددة جديدة وفئات منتج محددة جديدة، مما يتفق مع مبدأ الفتح/الإغلاق.

المزايا لنمط الطراز المصنعي تشمل:

  • تجميع عملية إنشاء الكائن، مما يجعل النظام أكثر مرونة وقابلاً للتوسيع.
  • إخفاء تفاصيل التنفيذ لفئات المنتج المحددة، مما يقلل من تبعية العميل واندماجه مع فئات محددة.
  • توفير طريقة موحدة لإنشاء المنتجات، مما يسهل صيانة النظام وتوسيعه.

٣. سيناريوهات تطبيق نمط الطراز المصنعي

نمط الطراز المصنعي مناسب للسيناريوهات التالية:

  • لا يعتمد العميل على فئات المنتج المحددة، بل يعتمد على واجهة المنتج المجردة.
  • يحتاج العميل إلى إنشاء كائنات منتج مختلفة بشكل ديناميكي استنادًا إلى شروط مختلفة.
  • الحاجة إلى تجميع وإخفاء عملية إنشاء كائن المنتج.

٤. تنفيذ نمط الطراز المصنعي في جولانغ

٤.١. رسم بياني للفصل الفئة في جولانغ

نمط الطراز المصنعي في جولانغ

٤.٢. الخطوة 1 من التنفيذ: تحديد واجهة المنتج المجردة

package factory

// Product هي واجهة المنتج المجردة
type Product interface {
	Operation() string
}

٤.٣. الخطوة 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"
}

٤.٤. الخطوة 3 من التنفيذ: تحديد واجهة المصنع المجردة

package factory

// Factory هي واجهة المصنع المجردة
type Factory interface {
	CreateProduct() Product
}

٤.٥. الخطوة 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{}
}

٤.٦. الخطوة 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. يمكن للعميل إنشاء كائنات المنتج المحددة عن طريق استدعاء طريقة المصنع المحددة، مما ينفذ نمط الطراز المصنعي.

مع الخطوات السابقة، قمنا بإكمال تنفيذ نمط الطراز المصنعي في جولانغ. يفصل هذا النهج العميل عن فئات المنتج المحددة، مما يسمح للعميل بالتركيز فقط على واجهة المنتج المجردة. في الوقت نفسه، يتم تجميع تفاصيل التنفيذ لفئات المنتج المحددة في فئة المصنع المحددة، مما يجعل النظام أكثر مرونة وقابل للتوسيع. نمط الطراز المصنعي شائع جدًا في التطبيقات العملية، خاصة في السيناريوهات التي يكون فيها الإنشاء الديناميكي لأنواع مختلفة من الكائنات ضروريًا، مما يعزز بشكل فعال قابلية استخدام الكود وصيانته.