কিভাবে সি++ এ সিঙ্গেলটন তৈরি করবেন

Kibhabe Si E Singelatana Tairi Karabena



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' ক্লাসের একটি পাবলিক স্ট্যাটিক সদস্য ফাংশন হিসাবে প্রয়োগ করা হয়। এটি স্ট্যাটিক সদস্য পরিবর্তনশীল উদাহরণে সংরক্ষিত সিঙ্গেলটনের উদাহরণ প্রদান করে। স্ট্যাটিক মেম্বার ভেরিয়েবল ইনস্ট্যান্সকে ক্লাসের বাইরে “Singleton* Singleton::instance = new Singleton();” দিয়ে সংজ্ঞায়িত করা হয়েছে। এই লাইনটি স্ট্যাটিক ইনিশিয়ালাইজেশনের সময় সাগ্রহে 'সিঙ্গেলটন' ক্লাসের উদাহরণ শুরু করে।



main() ফাংশনে, আমরা দুটি পয়েন্টার ঘোষণা করি, “singletonInstance1” এবং “singletonInstance2”, এবং Singleton::getInstance() কল করে যে মান ফেরত দেওয়া হয় তা নির্ধারণ করি। যেহেতু দৃষ্টান্তটি সাগ্রহে শুরু করা হয়েছে, উভয় পয়েন্টার একই উদাহরণের দিকে নির্দেশ করে। 'std::cout' স্টেটমেন্টগুলি '<<' অপারেটর এবং 'std::endl' ব্যবহার করে কনসোলে 'singletonInstance1' এবং 'singletonInstance2' এর মেমরি ঠিকানাগুলি প্রিন্ট করে।

কোডটি একটি 'রিটার্ন 0' দিয়ে শেষ হয় যা একটি সফল প্রোগ্রাম এক্সিকিউশন নির্দেশ করে।

আপনি যখন এই কোডটি চালান, তখন আউটপুটটি এরকম কিছু হয়:

আউটপুট 'singletonInstance1' এবং 'singletonInstance2' এর মেমরি ঠিকানা প্রদর্শন করে। যেহেতু উভয় পয়েন্টার একই দৃষ্টান্তের সাথে বরাদ্দ করা হয়েছে যা Singleton::getInstance( থেকে প্রাপ্ত হয়েছে), তাদের একই মেমরি ঠিকানা রয়েছে। এটি প্রদর্শন করে যে কীভাবে সিঙ্গেলটন প্যাটার্ন গ্যারান্টি দেয় যে ক্লাসের একটি একক উদাহরণ রয়েছে এবং ভবিষ্যতের getInstance() কলগুলি সর্বদা একই উদাহরণে পরিণত হয়।

উদাহরণ 2: অলস সূচনা সহ সিঙ্গলটন প্যাটার্ন বাস্তবায়ন

এই প্রদর্শনটি অলস প্রাথমিককরণের সাথে সিঙ্গলটন প্যাটার্ন বাস্তবায়ন ব্যাখ্যা করে এবং প্রধান() ফাংশনে এর ব্যবহার দেখায়। এই প্রোগ্রামের পরে কোড স্নিপেটের ধাপে ধাপে ব্যাখ্যা দেওয়া হয়েছে:

#অন্তর্ভুক্ত করুন

ক্লাস সিঙ্গেলটন {

ব্যক্তিগত :

স্থির সিঙ্গেলটন * দৃষ্টান্ত ;

সিঙ্গেলটন ( ) {

std :: cout << 'সিঙ্গলটন উদাহরণ তৈরি করা হয়েছে।' << std :: endl ;

}

সর্বজনীন :

স্থির সিঙ্গেলটন * getInstance ( ) {

যদি ( দৃষ্টান্ত == nullptr ) {

দৃষ্টান্ত = নতুন সিঙ্গেলটন ( ) ;

}

ফিরে দৃষ্টান্ত ;

}

অকার্যকর বার্তা দেখান ( ) {

std :: cout << 'সিঙ্গেলটন থেকে হ্যালো!' << std :: endl ;

}

~সিঙ্গলটন ( ) {

std :: cout << 'সিঙ্গেলটন উদাহরণ ধ্বংস করা হয়েছে।' << std :: endl ;

}

} ;

সিঙ্গেলটন * সিঙ্গেলটন :: দৃষ্টান্ত = nullptr ;

int প্রধান ( ) {

সিঙ্গেলটন * singletonInstance1 = সিঙ্গেলটন :: getInstance ( ) ;

singletonInstance1 -> বার্তা দেখান ( ) ;

সিঙ্গেলটন * singletonInstance2 = সিঙ্গেলটন :: getInstance ( ) ;

singletonInstance2 -> বার্তা দেখান ( ) ;

ফিরে 0 ;

}

ইনপুট/আউটপুট কাজগুলি সম্পাদন করার জন্য হেডার ফাইল যোগ করে প্রোগ্রামটি শুরু হয়। তারপর, আমরা একটি 'সিঙ্গেলটন' ক্লাস ঘোষণা এবং সংজ্ঞায়িত করি। ক্লাসের একমাত্র উদাহরণটিকে 'ইনস্ট্যান্স' নামে প্রাইভেট স্ট্যাটিক সদস্য ভেরিয়েবলের মধ্যে রাখা হয়।

যখনই 'Singleton' ক্লাসের কনস্ট্রাক্টর বলা হয়, এটি 'Singleton' ক্লাসের একটি উদাহরণ তৈরি করে। এটি 'std::cout << … << std::endl;' ব্যবহার করে কনসোলে 'Singleton instance created' বার্তাটি আউটপুট করে। কনস্ট্রাক্টরের কোনো প্যারামিটার নেই কারণ এটি একটি ডিফল্ট কনস্ট্রাক্টর। এটি কোনো যুক্তি ছাড়াই Singleton() হিসাবে সংজ্ঞায়িত করা হয়। আমরা এটিকে ব্যক্তিগত হিসাবে ঘোষণা করি যার অর্থ হল এটি শুধুমাত্র ক্লাসের ভিতর থেকে আহ্বান করা যেতে পারে। এটি 'Singleton' ক্লাসের সরাসরি ইন্সট্যান্টেশনকে বাধা দেয় এবং নিশ্চিত করে যে একটি উদাহরণ পাওয়ার একমাত্র উপায় হল getInstance() ফাংশন।

'Singleton' ক্লাসের getInstance() পদ্ধতিটিকে একটি পাবলিক স্ট্যাটিক সদস্য ফাংশন হিসাবে ঘোষণা করা হয়েছে। এটি সিঙ্গলটন উদাহরণে অ্যাক্সেসযোগ্যতা প্রতিষ্ঠা এবং প্রদানের ভূমিকায় রয়েছে। getInstance() এর ভিতরে, এটি পরীক্ষা করে যে উদাহরণটি 'nullptr' কিনা। যদি এটি হয়, ইঙ্গিত করে যে উদাহরণটি ইতিমধ্যে উপস্থিত নেই, এটি 'Singleton' ক্লাসের একটি নতুন অবজেক্ট ইনস্ট্যান্ট করতে ব্যক্তিগত কনস্ট্রাক্টর ব্যবহার করে।

showMessage() ফাংশনটি একটি সাধারণ সদস্য ফাংশন যা 'Hello from Singleton!' প্রদর্শন করে। বার্তা সিঙ্গলটনের ধ্বংসকারী সংজ্ঞায়িত করা হয়েছে। যখন প্রোগ্রামটি 'সিঙ্গেলটন ইনস্ট্যান্স ধ্বংস হয়ে গেছে' বন্ধ করে এবং মুদ্রণ করে তখন এটিকে বলা হয় নিহিতভাবে। বার্তা যা নির্দেশ করে যে সিঙ্গলটন উদাহরণটি ধ্বংস হয়ে গেছে। স্ট্যাটিক সদস্য পরিবর্তনশীল উদাহরণ প্রাথমিকভাবে 'nullptr' হিসাবে সংজ্ঞায়িত করা হয়.

int main() main() ফাংশনের সংজ্ঞা শুরু করে। তারপর, 'Singleton* singletonInstance1 = Singleton::getInstance();' 'Singleton' ক্লাসের getInstance() ফাংশন কল করে সিঙ্গেলটন ইনস্ট্যান্সের একটি পয়েন্টার পেতে। এটি এই পয়েন্টারটিকে “singletonInstance1” ভেরিয়েবলে বরাদ্দ করে।

এর পরে, 'singletonInstance1->showMessage();' 'singletonInstance1' পয়েন্টারে showMessage() ফাংশন কল করতে তীর অপারেটর (->) ব্যবহার করে। এই ফাংশনটি কনসোলে নির্দিষ্ট করা বার্তাটি প্রদর্শন করে। এর পরে, 'Singleton* singletonInstance2 = Singleton::getInstance();' getInstance() ফাংশনটিকে আবার কল করে, সিঙ্গলটন ইনস্ট্যান্সে আরেকটি পয়েন্টার প্রাপ্ত করে। এই সময়, এটি 'singletonInstance2' ভেরিয়েবলে পয়েন্টার বরাদ্দ করে। 'singletonInstance2->showMessage();' 'singletonInstance2' পয়েন্টারে showMessage() ফাংশন কল করে। এই ফাংশনটি 'Hello from Singleton!' প্রদর্শন করে কনসোলে আবার বার্তা পাঠান।

সবশেষে, 'রিটার্ন 0;' main() ফাংশনের সমাপ্তি নির্দেশ করে এবং প্রোগ্রামটি 0 এর মান প্রদান করে যা একটি সফল প্রোগ্রাম এক্সিকিউশনকে নির্দেশ করে।

এখানে পূর্বে-ব্যাখ্যাকৃত কোড স্নিপেটের আউটপুট:

এই ফলাফল নিশ্চিত করে যে 'Singleton' ক্লাস শুধুমাত্র একটি উদাহরণ তৈরির নিশ্চয়তা দেয় এবং এটি আরও কল করে getInstance() ফাংশন নির্ভরযোগ্যভাবে একই উদাহরণ দেয়।

উপসংহার

C++ এ একটি সিঙ্গলটন তৈরি করা একটি খুব দরকারী ধারণা। এই পোস্টে, আমরা প্রাথমিকভাবে সিঙ্গেলটনের পরিচিতি বিভাগটি কভার করেছি। অধিকন্তু, সি++ এ সিঙ্গেলটন বাস্তবায়নের জন্য দুটি উদাহরণ তৈরি করা হয়েছে। প্রথম দৃষ্টান্তটি উদগ্রীব সিঙ্গলটন ইনিশিয়ালাইজেশনের বাস্তবায়ন দেখায়। যেখানে সিঙ্গলটন প্যাটার্নের অলস প্রারম্ভিকতা বাস্তবায়ন এই নিবন্ধের দ্বিতীয় উদাহরণে প্রদান করা হয়েছে। অধিকন্তু, উত্পাদিত আউটপুটের স্ন্যাপশটগুলি সংশ্লিষ্ট প্রোগ্রামগুলির জন্যও প্রদর্শিত হয়।