9.1.1 الگو Singleton

9.1.1 الگو Singleton

سینگلتون یک الگوی طراحی سازنده است که به شما این اجازه را می‌دهد، تنها یک شی از ساختار خود را با دسترسی سراسری ایجاد کنید.

Singleton

الگوی طراحی سینگلتون:

  1. اطمینان می‌دهد که تنها یک شی از یک ساختار ایجاد می‌شود.
  2. مشابه یک متغیر سراسری، به شما امکان می‌دهد از هر جای برنامه به آن شی دسترسی داشته باشید و از بازنویسی توسط نقاط دیگر برنامه نیز محافظت می‌کند.
از الگوی سینگلتون زمانی استفاده کنید که بخواهید تنها یک شی از یک ساختار در دسترس کل برنامه باشد. به عنوان مثال، می‌توانید از الگوی سینگلتون برای ایجاد یک شی واحد از لاگر استفاده کنید که توسط بخش‌های مختلف برنامه به آن دسترسی دارند.

مثال مفهومی از الگوی سینگلتون:

package main

import (
    "fmt"
    "sync"
    "time"
)

type MyLogger struct {
}

var (
    globalLogger *MyLogger
    mu           = &sync.Mutex{}
)

func GetMyLoggerInstance(i int) *MyLogger {
    if globalLogger == nil {
       mu.Lock()
       defer mu.Unlock()
       if globalLogger == nil {
          fmt.Println("creating myLogger instance by", i)
          globalLogger = &MyLogger{}
       }
    } else {
       fmt.Println("myLogger instance already created.")
    }

    return globalLogger
}

func main() {
    for i := 1; i <= 5; i++ {
       go GetMyLoggerInstance(i)
    }
    time.Sleep(time.Second)
}

روش‌ دیگری نیز برای ایجاد یک شی توسط الگوی سینگلتون در زبان گو وجود دارد:

package main

import (
    "fmt"
    "sync"
    "time"
)

type MyLogger struct {
}

var (
    globalLogger *MyLogger
    once         sync.Once
)

func GetMyLoggerInstance(i int) *MyLogger {
    if globalLogger == nil {
       once.Do(
          func() {
             fmt.Println("creating myLogger instance by", i)
             globalLogger = &MyLogger{}
          })
    } else {
       fmt.Println("myLogger instance already created.")
    }

    return globalLogger
}

func main() {
    for i := 1; i <= 5; i++ {
       go GetMyLoggerInstance(i)
    }
    time.Sleep(time.Second)
}

مزایا: ✅ اطمینان می‌دهد که تنها یک شی از ساختار وجود دارد. ✅ دسترسی سراسری به آن شی را فراهم می‌کند. ✅ شی فقط در صورت نیاز به آن ایجاد و مقداردهی می‌شود.

معایب:اصل مسئولیت واحد را نقض می‌کند و ممکن است باعث پیچیدگی در کد شود. ❌ در برنامه‌های ماتی ترد ، پیاده‌سازی الگوی سینگلتون نیاز به رویکردهای خاص دارد و این ممکن است پیچیدگی را افزایش دهد.