9.1.1 الگو Singleton

9.1.1 الگو Singleton

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

Singleton

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

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

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

 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}
1$ go run main.go
2creating myLogger instance by 4

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

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