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

الگوی طراحی سینگلتون:
- اطمینان میدهد که تنها یک شی از یک ساختار ایجاد میشود.
- مشابه یک متغیر سراسری، به شما امکان میدهد از هر جای برنامه به آن شی دسترسی داشته باشید و از بازنویسی توسط نقاط دیگر برنامه نیز محافظت میکند.
از الگوی سینگلتون زمانی استفاده کنید که بخواهید تنها یک شی از یک ساختار در دسترس کل برنامه باشد. به عنوان مثال، میتوانید از الگوی سینگلتون برای ایجاد یک شی واحد از لاگر استفاده کنید که توسط بخشهای مختلف برنامه به آن دسترسی دارند.
مثال مفهومی از الگوی سینگلتون:
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)
}
مزایا: ✅ اطمینان میدهد که تنها یک شی از ساختار وجود دارد. ✅ دسترسی سراسری به آن شی را فراهم میکند. ✅ شی فقط در صورت نیاز به آن ایجاد و مقداردهی میشود.
معایب: ❌ اصل مسئولیت واحد را نقض میکند و ممکن است باعث پیچیدگی در کد شود. ❌ در برنامههای ماتی ترد ، پیادهسازی الگوی سینگلتون نیاز به رویکردهای خاص دارد و این ممکن است پیچیدگی را افزایش دهد.