"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > اذهب إلى أنماط التصميم #Singleton

اذهب إلى أنماط التصميم #Singleton

تم النشر بتاريخ 2024-11-08
تصفح:830

Go Design Patterns #Singleton

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

يمثل كل نمط أفضل الممارسات التي يمكن للمطورين التكيف معها مع سياقهم المحدد. غالبًا ما يتم تصنيف أنماط التصميم إلى ثلاث فئات رئيسية.

لبدء هذه السلسلة، دعونا نتحدث عن نمط سينجلتون.

سينجلتون

يضمن نمط Singleton أن يحتوي الفصل على مثيل واحد فقط ويوفر نقطة وصول عالمية إلى هذا المثيل.

يفيد هذا في الحالات التي تحتاج فيها إلى إدارة مورد مشترك، مثل اتصالات قاعدة البيانات أو إعدادات التكوين.

بيان المشكلة

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

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

مثال في العالم الحقيقي

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

تطبيق

package main

import (
    "fmt"
    "sync"
)

type Singleton interface {
    DoSomething() string
}

type singleton struct{}

var lock = &sync.Mutex{}

var instance *singleton

func NewSingletonInstance() *singleton {
    if instance == nil {
        lock.Lock()
        defer lock.Unlock()
        if instance == nil {
            fmt.Println("Creating single instance now.")
            instance = &singleton{}
        } else {
            fmt.Println("Single instance already created.")
        }
    } else {
        fmt.Println("Single instance already created.")
    }

    return instance
}

func (s *singleton) DoSomething() string {
    return "Doing something."
}

func main() {
    instance1 := NewSingletonInstance()
    instance2 := NewSingletonInstance()
    fmt.Printf("%p\n", instance1)
    fmt.Printf("%p\n", instance2)
}

تضمن وظيفة NewSingletonInstance إنشاء مثيل واحد فقط من المفردة، حتى عند استدعائها عدة مرات.

  • أولاً، يتحقق مما إذا كان المثيل صفرًا (أي لم يتم إنشاء مثيل حتى الآن).
  • إذا كان المثيل صفرًا، فسيتم قفل قسم التعليمات البرمجية باستخدام lock.Lock() لمنع goroutines متعددة من الدخول إلى هذا القسم في وقت واحد.
  • بعد القفل، يتم إجراء فحص ثانٍ للتأكد من عدم قيام goroutine آخر بإنشاء المثيل بين الفحص الأول ووقت الحصول على القفل.
  • إذا ظل المثيل صفرًا، فسيتم إنشاء مثيل مفرد جديد وتعيينه للمتغير العام.
  • يضمن sync.Mutex والقفل المزدوج أن إنشاء مثيل فردي آمن لسلسلة الرسائل، مما يمنع goroutines المتعددة من إنشاء مثيلات منفصلة.
بيان الافراج تم نشر هذه المقالة على: https://dev.to/eduardoarndt/go-design-patterns-1-singleton-4ap9?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3