Singleton Pattern

Singleton Pattern হচ্ছে চিরকাল একা । সোসাইটিতে বা সিস্টেমে তার মতো আর কেউ নেই। প্রোগ্রামিং এর ভাষায় যদি বলি তাহলে Singleton এর শর্ত হচ্ছে কোন Specific Class এর কেবল মাত্র একটি Object ই তৈরি করা যাবে। দ্বিতীয়বার এর আর কোন Object তৈরি করা যাবে না। বার বার ঐ একটাই ব্যবহার করতে হবে। তার মানে পুরা সিস্টেমে ঐ Class এর একটি মাত্র Object ই থাকবে । তাহলে যখনই কোন class এর একটি মাত্র object নিশ্চিত করতে হবে আমরা Singleton Pattern ফলো করবো ।
শুরুতে আমার মনে হয়ছিলো
"এ আর এমন কি, একটার বেশি object create না করলেই তো হইছে, system তো আর নিজে নিজে n সংখ্যক object create করে নিবে না।"
-- ব্যাপারটা হচ্ছে system নিজে থেকে object create না করলেও আপনি নিজেই যাতে create করতে না পারেন সেই validation করে দিতে পারে। আর এটাই হচ্ছে Singleton এর চমক ।
কোন class এর Constructor private করে দিলেই ঐ class এর বাইরে থেকে object create করা  যায় না।
এক্ষেত্রে ঐ class body এর মধ্যেই নিজের object create করতে হবে এবং সেটাই সবখানে ব্যবহার করবে ।
Singleton এর পারফেক্ট বাস্তব উদাহরণ হতে পারে যেকোনো টিমের Captain নির্বাচন। কেননা  টিমের Captain একজনই হয়। এজন্য আমরা Captain class এ তালা মাইরা দেবো, আই মিন Constructor private করে দিবো ।
class diagram টা খেয়াল করুন
Singleton Pattern Class Diagram

দেখুন Constructor এর পাশে তালার সিম্বল দেয়া ।

তাহলে Captain Class টা হবে
public class Captain {
private static Captain captain;
//We make the constructor private to prevent the use of "new"
private Captain() {
}
public static Captain getCaptain() {
// Lazy initialization
if (captain == null) {
captain = new Captain();
System.out.println("New Captain selected for our team");
} else {
System.out.print("You already have a Captain for your team.");
}
return captain;
}
}
view raw Captain.java hosted with ❤ by GitHub

main Method থেকে একের অধিক Captain create করার চেষ্টা করলেও একি রেজাল্ট পাবো।
আপনাদের একটা বাড়তি বিষয় আগেই জানিয়ে রাখি, এইযে getCaptain() মেথড কল করে আমরা কোন class এর অবজেক্ট তৈরি করে রিটার্ন করিয়ে নিচ্ছি এই কারণে এই ধরনের মেথড কে বলে Factory Method । এই বিষয় নিয়েই আলাদা দুইটা pattern আছে । Factory Method Pattern এবং Abstract Factory Method Pattern ।
public class SelectACaptain {
public static void main(String[] args)
{
// create a captain object
Captain c1 = Captain.getCaptain();
System.out.println("Our Captain object is : "+c1);
System.out.println("Trying to make another captain for our team");
Captain c2 = Captain.getCaptain();
if(c1 == c2)
{
System.out.println("c1 and c2 are same object "+c2);
}
}
}

আউটপুটঃ 
New Captain selected for our team
Our Captain object is : singleton.Captain@1540e19d
Trying to make another captain for our team
You already have a Captain for your team
c1 and c2 are same instance singleton.Captain@1540e19d
view raw Output hosted with ❤ by GitHub
 
সতর্কতাঃ 
এখানে Lazy initialization করা হয়েছে কারন শুধুমাত্র getCaptain() method call করলেই object create হবে তাছাড়া হবে না । কিন্তু এটা Thread Safe নয়। এজন্য আমরা Early initialization করতে পারি
private static Captain captain = new Captain();
মানে শুরুতেই object create করে রাখতে পারি যাতে করে প্রয়োজন হোক বা না হোক সবসময় একটা object create হয়েই থাকবে। যা মেমোরির জন্য ক্ষতিকর । 

আবার getCaptain() method synchronized করে দিতে পারি
public static synchronized Captain getCaptain(){
    //your code
}
কিন্তু synchronization system কে ধীর করে দেয় । যেজন্য এটা বুঝেশুনে ব্যবহার করা উচিত।

পরামর্শ
প্রোগ্রামিং এ নতুন কিছু শিখে ভালো মতো আয়ত্ত করতে চাইলে কোড লেখা বা ঐ বিষয়ের problem solving এর আর কোন বিকল্প নেই । তাহলে HackerRank থেকে Singleton Pattern এর প্রব্লেমটা সল্ভ করে ফেলুন । মনে রাখবেন যায় শিখুন আর যতবারই পড়ুন না কেনো কোড না লিখলে সেটা আপনার আয়ত্তে আসবে না ।



THE END

Singleton Pattern Singleton Pattern Reviewed by hnjaman on June 10, 2018 Rating: 5

2 comments:

Powered by Blogger.