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
}