أنماط التصميم في Go: أمثلة وتطبيق عملي

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر أنماط التصميم مهمة في Go



Go (Golang) هي لغة حديثة ومترجمة، تم إنشاؤها في Google لحل مشاكل الأنظمة عالية التحميل. على الرغم من بساطتها وإيجازها، فإن التطوير بلغة Go يتطلب فهم أنماط التصميم — وهي حلول مجربة للمشاكل النمطية. في هذه المقالة، سنشرح الأنماط الأساسية مع أمثلة كود ستساعدك على كتابة كود أكثر نقاءً، وقابلية للتوسع، وسهولة في الصيانة.



لماذا هذا مهم؟ لا تدعم Go البرمجة الشيئية التقليدية (الوراثة، التحميل الزائد للدوال)، ولكنها تقدم آليات قوية — الواجهات، التركيب، والـ goroutines. تتكيف الأنماط مع هذه الخصائص، مما يجعلها فعالة بشكل خاص.



أنماط الإنشاء (Creational)



تدير أنماط الإنشاء عملية إنشاء الكائنات. في Go، غالبًا ما يتم تنفيذها من خلال دوال البناء والواجهات.



1. Singleton (المفرد)



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



package main

import ( "fmt" "sync")

type Config struct { Port int Host string}

var ( instance *Config once sync.Once)

func GetConfig() *Config { once.Do(func() { instance = &Config{ Port: 8080, Host: "localhost", } }) return instance}

func main() { cfg1 := GetConfig() cfg2 := GetConfig() fmt.Println(cfg1 == cfg2) // true}


الشرح: يضمن sync.Once أن التهيئة ستحدث مرة واحدة فقط، حتى مع الوصول المتزامن. هذه هي الطريقة الاصطلاحية القياسية لتنفيذ Singleton في Go.



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



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



package main

import "fmt"

// واجهة المنتجtype Transport interface { Deliver() string}

// منتجات محددةtype Truck struct{}func (t *Truck) Deliver() string { return "توصيل بري" }

type Ship struct{}func (s *Ship) Deliver() string { return "توصيل بحري" }

// طريقة المصنعfunc CreateTransport(transportType string) Transport { switch transportType { case "land": return &Truck{} case "sea": return &Ship{} default: return nil }}

func main() { transport := CreateTransport("sea") fmt.Println(transport.Deliver()) // توصيل بحري}


3. Builder (الباني)



يسمح بإنشاء كائنات معقدة خطوة بخطوة. مثالي للكائنات التي تحتوي على العديد من المعاملات الاختيارية.



package main

import "fmt"

type Pizza struct { Dough string Sauce string Toppings []string}

type PizzaBuilder struct { dough string sauce string toppings []string}

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

func (b *PizzaBuilder) SetDough(dough string) *PizzaBuilder { b.dough = dough return b}

func (b *PizzaBuilder) SetSauce(sauce string) *PizzaBuilder { b.sauce = sauce return b}

func (b *PizzaBuilder) AddTopping(topping string) *PizzaBuilder { b.toppings = append(b.toppings, topping) return b}

func (b *PizzaBuilder) Build() *Pizza { return &Pizza{ Dough: b.dough, Sauce: b.sauce, Toppings: b.toppings, }}

func main() { pizza := NewPizzaBuilder(). SetDough("رقيقة"). SetSauce("طماطم"). AddTopping("جبن"). AddTopping("فطر"). Build() fmt.Printf("البيتزا: %+v", pizza)}


أنماط ال

المدونات

توصيات الكتب