أنماط التصميم في Go مع أمثلة للمطورين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في Go (Golang) مع أمثلة كود



أنماط التصميم هي حلول مجربة للمشكلات النمطية في التطوير. في Go، بفضل تركيبها المختصر وغياب البرمجة الكائنية التقليدية (OOP)، تكتسب العديد من الأنماط تنفيذاً فريداً. في هذه المقالة، سنشرح ثلاث مجموعات من الأنماط: الإنشائية، والهيكلية، والسلوكية — مع أمثلة عملية بلغة Golang.



ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة في Go الذين يسعون لكتابة كود نظيف وقابل لإعادة الاستخدام والاختبار.



1. الأنماط الإنشائية (Creational Patterns)



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



1.1. المفرد (Singleton)



يضمن وجود مثيل واحد فقط من النوع، ويوفر نقطة وصول عامة إليه. في Go، غالباً ما يتم تنفيذه عبر sync.Once.



package singleton

import ( "sync")

type Database struct { connection string}

var ( instance *Database once sync.Once)

func GetDatabase() *Database { once.Do(func() { instance = &Database{connection: "postgres://user:pass@localhost/db"} }) return instance}


متى يُستخدم: العمل مع تجمع الاتصالات، ذاكرة التخزين المؤقت، المسجل (logger).



1.2. طريقة المصنع (Factory Method)



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



package factory

import "fmt"

// Product interfacetype INotification interface { Send(message string) string}

// Concrete productstype Email struct{}

func (e *Email) Send(msg string) string { return fmt.Sprintf("Email sent: %s", msg)}

type SMS struct{}

func (s *SMS) Send(msg string) string { return fmt.Sprintf("SMS sent: %s", msg)}

// Factory functionfunc CreateNotification(notifType string) INotification { switch notifType { case "email": return &Email{} case "sms": return &SMS{} default: return nil }}


متى يُستخدم: عندما يكون نوع الكائن المراد إنشاؤه غير معروف مسبقاً.



1.3. الباني (Builder)



يفصل بناء الكائن المعقد عن تمثيله. في Go، الباني هو هيكل (struct) يحتوي على دوال ضبط (setters) تُرجع الكائن نفسه لاستدعاء متسلسل.



package builder

type Pizza struct { Size string Cheese bool Pepperoni bool}

type PizzaBuilder struct { pizza Pizza}

func NewPizzaBuilder() *PizzaBuilder { return &PizzaBuilder{}}

func (b *PizzaBuilder) SetSize(size string) *PizzaBuilder { b.pizza.Size = size return b}

func (b *PizzaBuilder) AddCheese() *PizzaBuilder { b.pizza.Cheese = true return b}

func (b *PizzaBuilder) AddPepperoni() *PizzaBuilder { b.pizza.Pepperoni = true return b}

func (b *PizzaBuilder) Build() Pizza { return b.pizza}


متى يُستخدم: عندما يحتوي الكائن على العديد من المعاملات الاختيارية.



2. الأنماط الهيكلية (Structural Patterns)



تحدد الأنماط الهيكلية طرق تجميع الكائنات والفئات في هياكل أكبر، مع الحفاظ على المرونة والكفاءة.



2.1. المُهايئ (Adapter)



يسمح للكائنات ذات الواجهات غير المتوافقة بالعمل معاً. في Go، يتم استخدام الواجهات والهياكل المغلفة (wrapper structs) لهذا الغرض.



package adapter

import "fmt"

// Target interfacetype USB interface { ConnectWithUSB() string}

// Adaptee (غير متوافق)type MemoryCard struct{}

func (m *MemoryCard) ReadFromCard() string { return "Data read from memory card"}

// Adaptertype CardReader struct { card *MemoryC

المدونات

توصيات الكتب