1. الگوی تک‌نمونه

الگوی تک‌نمونه یک الگوی طراحی ایجادی است که اطمینان می‌یابد یک کلاس فقط یک نمونه دارد و یک نقطه دسترسی جهانی برای به دست آوردن آن نمونه را فراهم می‌کند. الگوی تک‌نمونه معمولاً در صنایعی استفاده می‌شود که نیاز به به اشتراک گذاری منابع یا کنترل دسترسی به یک نمونه خاص وجود دارد.

2. ویژگی‌ها و مزایای الگوی تک‌نمونه

الگوی تک‌نمونه ویژگی‌ها و مزایاي زیر را دارد:

  • اطمینان از اینکه کلاس فقط یک نمونه دارد
  • فراهم کردن یک نقطه دسترسی جهانی برای کد خارجی برای به دست آوردن نمونه
  • جلوگیری از ایجاد تکراری نمونه‌ها و صرفه‌جویی در منابع سیستم

3. صحنه‌های کاربردی الگوی تک‌نمونه

الگوی تک‌نمونه برای صحنه‌های کاربردی زیر مناسب است:

  • ثبت‌کننده‌ها: اطمینان از اینکه فقط یک ثبت‌کننده برای سیستم کلی وجود دارد تا از ثبت تکراری جلوگیری شود.
  • استخر اتصال به پایگاه داده: در محیط‌های با هم‌زمانی بالا، استفاده از الگوی تک‌نمونه می‌تواند ایجاد و نابودی مکرر اتصال‌های پایگاه داده را جلوگیری کند.

4. پیاده‌سازی الگوی تک‌نمونه در گولانگ

در زبان برنامه نویسی گولانگ، روش‌های مختلفی برای پیاده‌سازی الگوی تک‌نمونه وجود دارد. در زیر دو روش پیاده‌سازی معمول آمده است.

4.1. پیاده‌سازی با استفاده از مقداردهی تنهازن

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

// پیاده‌سازی الگوی تک‌نمونه با مقداردهی تنهازن
package singleton

type Singleton struct {
}

var instance *Singleton

func GetInstance() *Singleton {
    if instance == nil {
        instance = &Singleton{}
    }
    return instance
}

// پیاده‌سازی الگوی تک‌نمونه با مقداردهی فوری
package singleton

type Singleton struct {
}

var instance *Singleton = &Singleton{}

func GetInstance() *Singleton {
    return instance
}

4.2. مشکلات ایمنی هم‌زمانی در الگوی تک‌نمونه

روش پیاده‌سازی مقداردهی تنهازن فوق ممکن است در محیط‌های چندنخی مشکل داشته باشد؛ زیرا ممکن است چند نخ همزمان به شرایط if instance == nil وارد شده و منجر به ایجاد چند نمونه شوند.

4.3. پیاده‌سازی الگوی تک‌نمونه ایمن از نظر هم‌زمانی با استفاده از sync.Once

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

// پیاده‌سازی الگوی تک‌نمونه ایمن از نظر هم‌زمانی با استفاده از sync.Once
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var once sync.Once

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

4.4. پیاده‌سازی الگوی تک‌نمونه مقدماتی ایمن از نظر هم‌زمانی با استفاده از sync.Mutex

یک روش دیگر برای پیاده‌سازی الگوی تک‌نمونه مقدماتی ایمن از نظر هم‌زمانی استفاده از sync.Mutex برای قفل کردن و اطمینان از اینکه فقط یک گوروتین عملیات مقدماتی را اجرا می‌کند.

// پیاده‌سازی الگوی تک‌نمونه مقدماتی ایمن از نظر هم‌زمانی با استفاده از sync.Mutex
package singleton

import (
    "sync"
)

type Singleton struct {
}

var instance *Singleton
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {
            instance = &Singleton{}
        }
    }
    return instance
}