Skip to content

Commit

Permalink
Merge pull request #310 from ArefTurkmenia/designPatternsCreationalSi…
Browse files Browse the repository at this point in the history
…ngelton

add: singleton section
  • Loading branch information
Ja7ad authored Sep 22, 2023
2 parents a05bc7d + 0e858f0 commit 98a8ffe
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 1 deletion.
118 changes: 117 additions & 1 deletion content/chapter 9/creational patterns/9.1.1-singleton.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,120 @@ slug: go-singleton-pattern
weight: 172001
---

الگو Singleton...
{{< tooltip text="سینگلتون" note="Singleton" >}} یک {{< tooltip text="الگوی طراحی سازنده" note="Creational Design Pattern" >}} است که به شما این اجازه را می‌دهد، تنها یک {{< tooltip text="شی" note="Object" >}} از {{< tooltip text="ساختار" note="Struct" >}} خود را با {{< tooltip text="دسترسی سراسری" note="Global Access" >}} ایجاد کنید.

{{<img url="#" image="../../../assets/img/content/chapter9/designPatterns/1.png" alt="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" >}}، پیاده‌سازی الگوی سینگلتون نیاز به رویکردهای خاص دارد و این ممکن است پیچیدگی را افزایش دهد.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 98a8ffe

Please sign in to comment.