From 0e858f0889cd0bd102897829f7fc0a8de8c155b9 Mon Sep 17 00:00:00 2001 From: Aref Turkmenia Date: Fri, 22 Sep 2023 14:54:02 +0330 Subject: [PATCH] add: singleton section --- .../creational patterns/9.1.1-singleton.md | 118 +++++++++++++++++- .../img/content/chapter9/designPatterns/1.png | Bin 0 -> 13963 bytes 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 static/assets/img/content/chapter9/designPatterns/1.png 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 0000000000000000000000000000000000000000..d9f84b67cec402478ea0e15ed7526fa0d261bade GIT binary patch literal 13963 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