1. ما هو نمط السنجلتون

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

2. السمات والمزايا لنمط السنجلتون

نمط السنجلتون لديه السمات والمزايا التالية:

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

3. سيناريوهات تطبيق نمط السنجلتون

نمط السنجلتون مناسب للسيناريوهات التطبيقية التالية:

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

4. تنفيذ نمط السنجلتون في جولانج

في جولانج، هناك طرق مختلفة لتنفيذ نمط السنجلتون. أدناه طريقتان شائعتان للتنفيذ.

4.1. تنفيذ باستخدام التهيئة الكسولة والتهيئة الحريصة

التهيئة الكسولة تنشئ مثيل الكائن عند أول استخدام له، بينما التهيئة الحريصة تنشئ مثيل الكائن عند بدء التشغيل.

// تنفيذ نمط السنجلتون باستخدام التهيئة الكسولة
package singleton

type Singleton struct {
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

// تنفيذ نمط السنجلتون باستخدام التهيئة الحريصة
package singleton

type Singleton struct {
}

var instance *Singleton = &Singleton{}

func GetInstance() *Singleton {
    return instance
}

4.2. قضايا أمان الموضوع في نمط السنجلتون

قد تواجه طريقة التهيئة الكسولة المذكورة أعلاه قضايا في بيئة متعددة المواضيع لأنه قد يدخل متعددو المواضيع بشكل متزامن إلى الشرط if instance == nil، مما يؤدي إلى إنشاء مثيلات متعددة.

4.3. تنفيذ نمط السنجلتون المواضيعي الآمن باستخدام sync.Once

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

// تنفيذ نمط السنجلتون المواضيعي الآمن باستخدام sync.Once
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

4.4. تنفيذ نمط السنجلتون الكسولي المواضيعي الآمن باستخدام sync.Mutex

طريقة أخرى لتنفيذ نمط السنجلتون الكسولي المواضيعي الآمن هي استخدام sync.Mutex لقفل والتأكد من أن جوروتين واحد فقط ينفذ عملية التهيئة.

// تنفيذ نمط السنجلتون الكسولي المواضيعي الآمن باستخدام sync.Mutex
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {
            instance = &Singleton{}
        }
    }
    return instance
}