C++ میں سنگلٹن کیسے بنائیں

C My Sngl N Kys Bnayy



C++ میں، سنگلٹن ایک ڈیزائن کا اصول ہے جو پورے پروگرام میں کلاس کی ایک تنہا مثال کی موجودگی کو یقینی بناتا ہے اور اس خاص مثال کے لیے عالمی رسائی پوائنٹ فراہم کرتا ہے۔

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

اس آرٹیکل میں، ہم سنگلٹن کی تخلیق کی وضاحت کریں گے اور C++ پروگرام میں سنگلٹن کو اسٹائل کرنے کی مثال دکھائیں گے۔







مثال 1: شوقین آغاز کے ساتھ ایک سادہ سنگلٹن بنانا

ابتدائی آغاز کے ساتھ ایک سادہ سنگلٹن ایک ڈیزائن پیٹرن ہے جو اس بات کو یقینی بناتا ہے کہ کلاس کی صرف ایک مثال بنائی گئی ہے، اور یہ جامد ابتدا کے دوران بے تابی سے تخلیق کی جاتی ہے۔



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



# شامل کریں

سنگلٹن کلاس {
نجی :
جامد سنگلٹن * مثال ;
سنگلٹن ( ) { }
عوام :
جامد سنگلٹن * getInstance ( ) {
واپسی مثال ;
}
} ;


سنگلٹن * سنگلٹن :: مثال = نیا سنگلٹن ( ) ;

int مرکزی ( ) {

سنگلٹن * singletonInstance1 = سنگلٹن :: getInstance ( ) ;

سنگلٹن * singletonInstance2 = سنگلٹن :: getInstance ( ) ;

std :: cout << 'singletonletonInstance1:' << singletonInstance1 << std :: endl ;

std :: cout << 'singletonletonInstance2:' << singletonInstance2 << std :: endl ;

واپسی 0 ;

}

کوڈ میں ہیڈر شامل ہے جو ان پٹ اور آؤٹ پٹ اسٹریمز جیسے 'std::cout' کے ساتھ کام کرنے کی فعالیت فراہم کرتا ہے۔





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

پھر، getInstance() فنکشن کو 'Singleton' کلاس کے پبلک سٹیٹک ممبر فنکشن کے طور پر لاگو کیا جاتا ہے۔ یہ سنگلٹن کی مثال واپس کرتا ہے جو جامد ممبر متغیر مثال میں محفوظ ہے۔ جامد ممبر متغیر مثال کی وضاحت اور کلاس کے باہر 'سنگلٹن* سنگلٹن::مثال = نیا سنگلٹن();' کے ساتھ کی گئی ہے۔ یہ لائن جامد ابتدا کے دوران 'سنگلٹن' کلاس کی مثال کو بے تابی سے شروع کرتی ہے۔



مین() فنکشن میں، ہم دو پوائنٹرز کا اعلان کرتے ہیں، 'singletonInstance1' اور 'singletonInstance2'، اور وہ ویلیو تفویض کرتے ہیں جو Singleton::getInstance() کو کال کرکے واپس کی جاتی ہے۔ چونکہ مثال بے تابی سے شروع کی گئی ہے، دونوں پوائنٹر ایک ہی مثال کی طرف اشارہ کرتے ہیں۔ 'std::cout' بیانات '<<' آپریٹر اور 'std::endl' کا استعمال کرتے ہوئے 'singletonInstance1' اور 'singletonInstance2' کے میموری ایڈریس کو کنسول پر پرنٹ کرتے ہیں۔

کوڈ 'واپسی 0' کے ساتھ ختم ہوتا ہے جو پروگرام کے کامیاب عمل کی نشاندہی کرتا ہے۔

جب آپ اس کوڈ کو چلاتے ہیں تو آؤٹ پٹ کچھ اس طرح ہوتا ہے:

آؤٹ پٹ 'singletonInstance1' اور 'singletonInstance2' کے میموری ایڈریس دکھاتا ہے۔ چونکہ دونوں پوائنٹرز ایک ہی مثال کے ساتھ تفویض کیے گئے ہیں جو Singleton::getInstance( سے حاصل کیے گئے ہیں)، ان کے پاس ایک ہی میموری ایڈریس ہے۔ یہ ظاہر کرتا ہے کہ سنگلٹن پیٹرن کس طرح اس بات کی ضمانت دیتا ہے کہ کلاس کی ایک ہی مثال موجود ہے اور یہ کہ مستقبل میں getInstance() کی کالز کا نتیجہ ہمیشہ ایک ہی مثال میں آتا ہے۔

مثال 2: سست آغاز کے ساتھ سنگلٹن پیٹرن کا نفاذ

یہ مظاہرہ سست آغاز کے ساتھ سنگلٹن پیٹرن کے نفاذ کی وضاحت کرتا ہے اور مین() فنکشن میں اس کے استعمال کو ظاہر کرتا ہے۔ کوڈ کے ٹکڑوں کی مرحلہ وار وضاحت اس پروگرام کے بعد فراہم کی جاتی ہے:

# شامل کریں

سنگلٹن کلاس {

نجی :

جامد سنگلٹن * مثال ;

سنگلٹن ( ) {

std :: cout << 'سنگلٹن مثال تخلیق کی گئی۔' << std :: endl ;

}

عوام :

جامد سنگلٹن * getInstance ( ) {

اگر ( مثال == nullptr ) {

مثال = نیا سنگلٹن ( ) ;

}

واپسی مثال ;

}

باطل showMessage ( ) {

std :: cout << 'سنگلٹن کی طرف سے ہیلو!' << std :: endl ;

}

~ سنگلٹن ( ) {

std :: cout << 'سنگلٹن مثال کو تباہ کر دیا گیا۔' << std :: endl ;

}

} ;

سنگلٹن * سنگلٹن :: مثال = nullptr ;

int مرکزی ( ) {

سنگلٹن * singletonInstance1 = سنگلٹن :: getInstance ( ) ;

singletonInstance1 -> showMessage ( ) ;

سنگلٹن * singletonInstance2 = سنگلٹن :: getInstance ( ) ;

singletonInstance2 -> showMessage ( ) ;

واپسی 0 ;

}

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

جب بھی 'سنگلٹن' کلاس کے کنسٹرکٹر کو بلایا جاتا ہے، یہ 'سنگلٹن' کلاس کی ایک مثال تیار کرتا ہے۔ یہ 'std::cout << … << std::endl;' کا استعمال کرتے ہوئے کنسول میں 'Singleton instance created' پیغام کو آؤٹ پٹ کرتا ہے۔ کنسٹرکٹر کے پاس کوئی پیرامیٹرز نہیں ہیں کیونکہ یہ ڈیفالٹ کنسٹرکٹر ہے۔ اسے بغیر کسی دلائل کے سنگلٹن () کے طور پر بیان کیا گیا ہے۔ ہم اسے نجی قرار دیتے ہیں جس کا مطلب ہے کہ اسے صرف کلاس کے اندر سے ہی طلب کیا جا سکتا ہے۔ یہ 'سنگلٹن' کلاس کے براہ راست انسٹی ٹیشن کو روکتا ہے اور اس بات کو یقینی بناتا ہے کہ ایک مثال حاصل کرنے کا واحد طریقہ getInstance() فنکشن کے ذریعے ہے۔

'سنگلٹن' کلاس کے getInstance() طریقہ کو عوامی جامد ممبر فنکشن کے طور پر قرار دیا گیا ہے۔ یہ سنگلٹن مثال تک رسائی کو قائم کرنے اور دینے کے کردار میں ہے۔ getInstance() کے اندر، یہ چیک کرتا ہے کہ آیا مثال 'nullptr' ہے۔ اگر یہ ہے، اس بات کی نشاندہی کرتے ہوئے کہ مثال پہلے سے موجود نہیں ہے، یہ 'سنگلٹن' کلاس کی ایک نئی چیز کو انسٹیٹیوٹ کرنے کے لیے پرائیویٹ کنسٹرکٹر کا استعمال کرتا ہے۔

showMessage() فنکشن ایک سادہ ممبر فنکشن ہے جو 'Hello from Singleton!' دکھاتا ہے۔ پیغام سنگلٹن کے تباہ کن کی تعریف کی گئی ہے۔ اسے واضح طور پر کہا جاتا ہے جب پروگرام ختم کرتا ہے اور 'سنگلٹن مثال کو تباہ کر دیا گیا' پرنٹ کرتا ہے۔ پیغام جو اشارہ کرتا ہے کہ سنگلٹن مثال تباہ ہو گئی ہے۔ جامد ممبر متغیر مثال کو ابتدائی طور پر 'nullptr' کے طور پر بیان کیا گیا ہے۔

int main() main() فنکشن کی تعریف شروع کرتا ہے۔ پھر، 'Singleton* singletonInstance1 = Singleton::getInstance();' سنگلٹن مثال کے لیے پوائنٹر حاصل کرنے کے لیے 'سنگلٹن' کلاس کے getInstance() فنکشن کو کال کرتا ہے۔ یہ اس پوائنٹر کو 'singletonInstance1' متغیر کو تفویض کرتا ہے۔

اس کے بعد، 'singletonInstance1->showMessage();' 'singletonInstance1' پوائنٹر پر showMessage() فنکشن کو کال کرنے کے لیے تیر آپریٹر (->) کا استعمال کرتا ہے۔ یہ فنکشن کنسول میں اس پیغام کو ظاہر کرتا ہے جو اس میں بیان کیا گیا ہے۔ اس کے بعد، 'Singleton* singletonInstance2 = Singleton::getInstance();' getInstance() فنکشن کو دوبارہ کال کرتا ہے، سنگلٹن مثال کے لیے ایک اور پوائنٹر حاصل کرتا ہے۔ اس بار، یہ پوائنٹر کو 'singletonInstance2' متغیر کو تفویض کرتا ہے۔ 'singletonInstance2->showMessage();' 'singletonInstance2' پوائنٹر پر showMessage() فنکشن کو کال کرتا ہے۔ یہ فنکشن 'Hello from Singleton!' دکھاتا ہے۔ کنسول کو دوبارہ پیغام بھیجیں۔

آخر میں، 'واپسی 0؛' مین() فنکشن کے اختتام کی نشاندہی کرتا ہے، اور پروگرام 0 کی قدر لوٹاتا ہے جو کہ کامیاب پروگرام کے عمل کو ظاہر کرتا ہے۔

یہاں پہلے بیان کردہ کوڈ کے ٹکڑوں کا آؤٹ پٹ ہے:

یہ نتیجہ اس بات کی تصدیق کرتا ہے کہ 'سنگلٹن' کلاس صرف ایک مثال کی تخلیق کی یقین دہانی کراتی ہے اور یہ کہ getInstance() فنکشن کو مزید کالز قابل اعتماد طریقے سے وہی مثال فراہم کرتی ہیں۔

نتیجہ

C++ میں سنگلٹن بنانا ایک بہت مفید تصور ہے۔ اس پوسٹ میں، ہم نے ابتدائی طور پر سنگلٹن کے تعارفی حصے کا احاطہ کیا۔ مزید برآں، C++ میں سنگلٹن کو نافذ کرنے کے لیے دو مثالیں پیش کی جاتی ہیں۔ پہلی مثال بیتاب سنگلٹن ابتداء کے نفاذ کو ظاہر کرتی ہے۔ جبکہ سنگلٹن پیٹرن کا سست آغاز اس مضمون کی دوسری مثال میں فراہم کیا گیا ہے۔ مزید برآں، تیار کردہ آؤٹ پٹ کے سنیپ شاٹس بھی متعلقہ پروگراموں کے لیے دکھائے جاتے ہیں۔