diff --git a/content/chapter 9/creational patterns/9.1.1-singleton.md b/content/chapter 9/creational patterns/9.1.1-singleton.md index 502b69cd6..7da27a20e 100644 --- a/content/chapter 9/creational patterns/9.1.1-singleton.md +++ b/content/chapter 9/creational patterns/9.1.1-singleton.md @@ -4,4 +4,120 @@ slug: go-singleton-pattern weight: 172001 --- -الگو Singleton... \ No newline at end of file +{{< tooltip text="سینگلتون" note="Singleton" >}} یک {{< tooltip text="الگوی طراحی سازنده" note="Creational Design Pattern" >}} است که به شما این اجازه را می‌دهد، تنها یک {{< tooltip text="شی" note="Object" >}} از {{< tooltip text="ساختار" note="Struct" >}} خود را با {{< tooltip text="دسترسی سراسری" note="Global Access" >}} ایجاد کنید. + +{{Singleton}} + +**الگوی طراحی سینگلتون:** +1. اطمینان می‌دهد که تنها یک شی از یک ساختار ایجاد می‌شود. +2. مشابه یک متغیر سراسری، به شما امکان می‌دهد از هر جای برنامه به آن شی دسترسی داشته باشید و از بازنویسی توسط نقاط دیگر برنامه نیز محافظت می‌کند. + +{{< hint info >}} +از الگوی سینگلتون زمانی استفاده کنید که بخواهید تنها یک شی از یک ساختار در دسترس کل برنامه باشد. به عنوان مثال، می‌توانید از الگوی سینگلتون برای ایجاد یک شی واحد از {{< tooltip text="لاگر" note="Logger" >}} استفاده کنید که توسط بخش‌های مختلف برنامه به آن دسترسی دارند. +{{< /hint >}} + +**مثال مفهومی از الگوی سینگلتون:** + +```go +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) +} +``` + +```shell +$ go run main.go +creating myLogger instance by 2 +myLogger instance already created. +myLogger instance already created. +myLogger instance already created. +myLogger instance already created. +``` + +**روش‌ دیگری نیز برای ایجاد یک شی توسط الگوی سینگلتون در زبان گو وجود دارد:** + +```go +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) +} +``` + +```shell +$ go run main.go +creating myLogger instance by 4 +``` + +**مزایا:** +✅ اطمینان می‌دهد که تنها یک شی از ساختار وجود دارد. +✅ دسترسی سراسری به آن شی را فراهم می‌کند. +✅ شی فقط در صورت نیاز به آن ایجاد و مقداردهی می‌شود. + +**معایب:** +❌ {{< tooltip text="اصل مسئولیت واحد" note="Single Responsibility Principle" >}} را نقض می‌کند و ممکن است باعث پیچیدگی در کد شود. +❌ در برنامه‌های {{< tooltip text="ماتی ترد" note="Multi Thread" >}}، پیاده‌سازی الگوی سینگلتون نیاز به رویکردهای خاص دارد و این ممکن است پیچیدگی را افزایش دهد. \ No newline at end of file diff --git a/static/assets/img/content/chapter9/designPatterns/1.png b/static/assets/img/content/chapter9/designPatterns/1.png new file mode 100644 index 000000000..d9f84b67c Binary files /dev/null and b/static/assets/img/content/chapter9/designPatterns/1.png differ