سینگلتون یک الگوی طراحی سازنده است که به شما این اجازه را میدهد، تنها یک شی از ساختار خود را با دسترسی سراسری ایجاد کنید.
الگوی طراحی سینگلتون:
- اطمینان میدهد که تنها یک شی از یک ساختار ایجاد میشود.
- مشابه یک متغیر سراسری، به شما امکان میدهد از هر جای برنامه به آن شی دسترسی داشته باشید و از بازنویسی توسط نقاط دیگر برنامه نیز محافظت میکند.
از الگوی سینگلتون زمانی استفاده کنید که بخواهید تنها یک شی از یک ساختار در دسترس کل برنامه باشد. به عنوان مثال، میتوانید از الگوی سینگلتون برای ایجاد یک شی واحد از لاگر استفاده کنید که توسط بخشهای مختلف برنامه به آن دسترسی دارند.
مثال مفهومی از الگوی سینگلتون:
1package main
2
3import (
4 "fmt"
5 "sync"
6 "time"
7)
8
9type MyLogger struct {
10}
11
12var (
13 globalLogger *MyLogger
14 mu = &sync.Mutex{}
15)
16
17func GetMyLoggerInstance(i int) *MyLogger {
18 if globalLogger == nil {
19 mu.Lock()
20 defer mu.Unlock()
21 if globalLogger == nil {
22 fmt.Println("creating myLogger instance by", i)
23 globalLogger = &MyLogger{}
24 }
25 } else {
26 fmt.Println("myLogger instance already created.")
27 }
28
29 return globalLogger
30}
31
32func main() {
33 for i := 1; i <= 5; i++ {
34 go GetMyLoggerInstance(i)
35 }
36 time.Sleep(time.Second)
37}
1$ go run main.go
2creating myLogger instance by 2
3myLogger instance already created.
4myLogger instance already created.
5myLogger instance already created.
6myLogger instance already created.
روش دیگری نیز برای ایجاد یک شی توسط الگوی سینگلتون در زبان گو وجود دارد:
1package main
2
3import (
4 "fmt"
5 "sync"
6 "time"
7)
8
9type MyLogger struct {
10}
11
12var (
13 globalLogger *MyLogger
14 once sync.Once
15)
16
17func GetMyLoggerInstance(i int) *MyLogger {
18 if globalLogger == nil {
19 once.Do(
20 func() {
21 fmt.Println("creating myLogger instance by", i)
22 globalLogger = &MyLogger{}
23 })
24 } else {
25 fmt.Println("myLogger instance already created.")
26 }
27
28 return globalLogger
29}
30
31func main() {
32 for i := 1; i <= 5; i++ {
33 go GetMyLoggerInstance(i)
34 }
35 time.Sleep(time.Second)
36}
مزایا:
✅ اطمینان میدهد که تنها یک شی از ساختار وجود دارد.
✅ دسترسی سراسری به آن شی را فراهم میکند.
✅ شی فقط در صورت نیاز به آن ایجاد و مقداردهی میشود.
معایب:
❌ اصل مسئولیت واحد
را نقض میکند و ممکن است باعث پیچیدگی در کد شود.
❌ در برنامههای ماتی ترد
، پیادهسازی الگوی سینگلتون نیاز به رویکردهای خاص دارد و این ممکن است پیچیدگی را افزایش دهد.