1. فلائی‌ویٹ پیٹرن کیا ہے

1.1 تعریف اور تصور

فلائی‌ویٹ پیٹرن ایک ساختی ڈیزائن پیٹرن ہے جس کا اصل مقصد موجودہ اشیاء کی تعداد کم کر کے میموری بچانا اور کارکردگی میں بہتری کرنا ہوتا ہے۔ فلائی‌ویٹ پیٹرن نے اشیاء کی تخلیق اور استعمال کو کم کرکے اشتراکی یا مشابہ اشیاء کا اشتراک کرکے کارکردگی کو حاصل کیا ہے۔

1.2 دیگر ڈیزائن پیٹرنز سے مختلفیت

دوسرے ڈیزائن پیٹرنز کے مقابلے میں، فلائی‌ویٹ پیٹرن کا زیادہ تر توجہ اشیاء کو اشتراک کرنے اور دوبارہ استعمال کرنے پر ہے۔ یہ اشیاء کو شئیرےبل اندرنل اسٹیٹ اور غیر شئیرےبل ایکسٹرنل اسٹیٹس میں تقسیم کرتا ہے۔ اندرنل اسٹیٹس کو شئیر کرکے، یہ اشیاء کی تخلیق اور میموری استعمال کم کرتا ہے، جس سے نظام کی کارکردگی میں اضافہ ہوتا ہے۔

2. فلائی‌ویٹ پیٹرن کی خصوصیات اور فوائد

فلائی‌ویٹ پیٹرن کی اہم خصوصیات اور فوائد میں شامل ہیں:

  • میموری کی استعمال کم کرنا: یہ میموری کی استعمال کم کرتا ہے باکی یا مشابہ اشیاء کو شیئر کرکے۔
  • کارکردگی میں بہتری: یہ اشیاء کی تخلیق اور تباہی کو کم کر کے، نظام کی عمل میں تیزی لاتا ہے۔
  • بے نک مشقت کی بڑی تعداد کی مدد: یہ بے نک اشیاء کی بڑی تعداد کو کم میموری میں بنا سکتا ہے۔
  • سادہ نظام کا ڈھانچا: اشیاء کے اندرنل اور ایکسٹرنل اسٹیٹس کو الگ کرکے، نظام کے ڈھانچے اور پیچیدگی میں سادگی لاتا ہے۔

3. فلائی‌ویٹ پیٹرن کے عملی اطلاق کی مثالیں

فلائی‌ویٹ پیٹرن درج ذیل نظاموں میں لاگو کیا جا سکتا ہے:

  • کھیلوں میں ذرہ اشیاء: ہر ذرہ شئیرےبل اور غیر شئیرےبل اسٹیٹس میں تقسیم کی جا سکتی ہے، اور ایکسٹرنل اسٹیٹ کے ساتھ مشابہ ذرہ اشیاء کو شیئر کیا جا سکتا ہے۔
  • نیٹ ورک سرورز میں کنیکشن اشیاء: کنیکشن اشیاء کی خصوصیات اشتراکی اور غیر اشتراکی اسٹیٹس میں تقسیم کی جا سکتی ہیں، اور پرانے کنیکشن اشیاء کو بحال ہونے سے پہلے دوبارہ استعمال کیا جا سکتا ہے۔

4. گولانگ میں فلائی‌ویٹ پیٹرن کا نافذہ

4.1 یوایم‌ایل کلاس ڈائیاگرام

فلائی‌ویٹ پیٹرن کا گولانگ میں یوم‌ایل کلاس ڈائیاگرام مندرجہ ذیل ہے:

Flyweight Pattern in Golang

4.2 مثال کی تعاریف

اس مثال میں، ہم فلائی‌ویٹ پیٹرن پر بنایا گیا گرافک ایڈیٹر بنائیں گے، جس میں مختلف رنگوں کے دائروں کا موجود ہوں اور دائرہ اشیاء کو شیئر کر کے میموری کا استعمال کم کریں گے۔

4.3 نافذہ کے مراحل

4.3.1 فلائی‌ویٹ انٹرفیس اور کنکریٹ فلائی‌ویٹ کلاس بنانا

پہلے، ہمیں ایک فلائی‌ویٹ انٹرفیس بنانے کی ضرورت ہوتی ہے تاکہ شیئر کردہ اشیاء کے عملیات کی تعریف کریں۔ پھر ہم ایک کنکریٹ فلائی‌ویٹ کلاس بنا سکتے ہیں تاکہ فلائی‌ویٹ انٹرفیس کو نافذ کریں اور اندرونی اسٹیٹس شامل کریں۔

// فلائی‌ویٹ شیئر کرنے والے اشیاء کے انٹرفیس کی تعریف کرتا ہے
type فلائی‌ویٹ interface {
	عملیات(بیرونی اسٹیٹ)
}

// ConcreteFlyweight منفرد فلائی‌ویٹ اشیاء کو ظاہر کرتا ہے، فلائی‌ویٹ انٹرفیس کا عملیات نافذ کرتا ہے
type ConcreteFlyweight struct {
	اندرونی اسٹیٹ
}

// عملیات شیئر کردہ شیئے کی عملیاتی طریقہ کار کو نافذ کرتا ہے
func (f *ConcreteFlyweight) عملیات(بیرونی اسٹیٹ) {
	fmt.Printf("مضبوط فلائیٹ اشیئے، اندرونی حالت: %s، بیرونی حالت: %s\n", f.اندرونی اسٹیٹ, بیرونی اسٹیٹ)
}

4.3.2 فلائی‌ویٹ فیکٹری کلاس بنانا

اس کے بعد، ہم ایک فلائی‌ویٹ فیکٹری کلاس بنا سکتے ہیں تاکہ فلائی‌ویٹ اشیاء کو منظم اور شئیر کرے۔ یہ فیکٹری کلاس ایک فلائیٹس ڈکشنری کو محفوظ رکھتا ہے تاکہ بنائی گئی فلائیٹ اشیاء کو ذخیرہ کرے۔

// فلائی‌ویٹ فیکٹری کلاس
type FlyweightFactory struct {
    فلائیٹس map[string]فلائی‌ویٹ
}

// GetFlyweight فیکٹری سے فلائیٹ اشیاء کو حاصل یا بناتا ہے
func (f *فلائی‌ویٹ فیکٹری) GetFlyweight(کلید string) فلائی‌ویٹ {
    if fw, ok := f.فلائیٹس[کلید]; ok {
        return fw
    }

    فلائیٹ := &ConcreteFlyweight{
        اندرونی اسٹیٹ: کلید,
    }

    f.فلائیٹس[کلید] = فلائیٹ

    return فلائیٹ
}

4.3.3 کلاینٹ کال مثال

آخر میں، ہم ایک کلاینٹ کلاس بنا سکتے ہیں تاکہ دکھایا جا سکے کہ فلائیٹ پیٹرن کو استعمال کر کے گرافک ایڈیٹر کو کیسے نافذ کیا جاتا ہے۔

// کلاینٹ کلاس
type کلاینٹ struct {
    فلائیٹ فلائیٹ
}

// عملیات ایک عمل انجام دیتا ہے
func (c *کلاینٹ) عملیات() {
    c.فلائیٹ.عملیات("بیرونی حالت")
}

4.4 نافذہ کے مدنظر رکھنے اور بہتر عمل کرنے کا غور

4.4.1 حالت کا اشتراک اور تھریڈ سلامتی

فلائی ویٹ پیٹرن استعمال کرتے وقت، اندرونی حالت کا اشتراک اور تھریڈ سلامتی پر توجہ دینے کی ضرورت ہوتی ہے۔ کیونکہ فلائی ویٹ آبجیکٹس کو متعدد گاہکوں کے ذریعے اشتراک کیا جاتا ہے، لہذا اندرونی حالت کی تسلسل کو یقینی بنانا ضروری ہے۔

4.4.2 آبجیکٹ پول کا انتظام

فلائی ویٹ آبجیکٹس کو بہتر انتظام اور دوبارہ استعمال کے لئے، آبجیکٹ پولز استعمال کیے جا سکتے ہیں تاکہ بنائے گئے فلائی ویٹ آبجیکٹس کو ذخیرہ کیا جا سکے۔ آبجیکٹ پولز سے آبجیکٹس کا دوبارہ استعمال بڑھ سکتا ہے اور آبجیکٹ بنانے اور تباہی کی اوور ہیڈ کم کر سکتی ہے۔

4.4.3 آبجیکٹ کی بیرونی حالت کا انتظام

فلائی ویٹ پیٹرن آبجیکٹس کی اندرونی حالت اور بیرونی حالت کو الگ کرتا ہے، لیکن بیرونی حالت کا انتظام گاہک کے ذمہ دار ہوتا ہے۔ فلائی ویٹ آبجیکٹس کا استعمال کرتے وقت، گاہک کو آبجیکٹ کی بیرونی حالت کو فلائی ویٹ آبجیکٹ میں عمل کرانے کی ضرورت ہوتی ہے۔

آخری کوڈ مثال

ذیل میں ایک مکمل گولانگ کوڈ مثال دی گئی ہے:

package main

import "fmt"

// Flyweight defines the interface of a flyweight object
type Flyweight interface {
    Operation(extrinsicState string)
}

// ConcreteFlyweight represents a specific flyweight object and implements the Flyweight interface
type ConcreteFlyweight struct {
    intrinsicState string
}

// Operation implements the operation method for shared objects
func (f *ConcreteFlyweight) Operation(extrinsicState string) {
    fmt.Printf("Concrete flyweight object, internal state: %s, external state: %s\n", f.intrinsicState, extrinsicState)
}

// FlyweightFactory class
type FlyweightFactory struct {
    flyweights map[string]Flyweight
}

// GetFlyweight retrieves or creates a flyweight object from the factory
func (f *FlyweightFactory) GetFlyweight(key string) Flyweight {
    if fw, ok := f.flyweights[key]; ok {
        return fw
    }

    flyweight := &ConcreteFlyweight{
        intrinsicState: key,
    }

    f.flyweights[key] = flyweight

    return flyweight
}

// Client class
type Client struct {
    flyweight Flyweight
}

// Operation performs an operation
func (c *Client) Operation() {
    c.flyweight.Operation("external state")
}

func main() {
    factory := &FlyweightFactory{
        flyweights: make(map[string]Flyweight),
    }

    flyweight1 := factory.GetFlyweight("A")
    flyweight1.Operation("external state 1")

    flyweight2 := factory.GetFlyweight("B")
    flyweight2.Operation("external state 2")

    client := &Client{
        flyweight: factory.GetFlyweight("A"),
    }
    client.Operation()
}