জাভাতে সিঙ্গলটন কি?
সিঙ্গেলটন হল সবচেয়ে সহজ ক্লাস-লেভেল ডিজাইন প্যাটার্নগুলির মধ্যে একটি। কখনও কখনও লোকেরা বলে "এই ক্লাসটি সিঙ্গেলটন", যার অর্থ হল ক্লাসটি সিঙ্গেলটন ডিজাইন প্যাটার্ন প্রয়োগ করে৷ কখনও কখনও এটি এমন একটি ক্লাস লিখতে হয় যেখানে আমরা একটি একক বস্তুতে ইন্সট্যান্টিয়েশনকে সীমাবদ্ধ করে৷ উদাহরণস্বরূপ, একটি ক্লাস লগিং বা সংযোগ করার জন্য দায়ী ডাটাবেস। সিঙ্গেলটন ডিজাইন প্যাটার্ন বর্ণনা করে কিভাবে আমরা এটি অর্জন করতে পারি। সিঙ্গেলটন হল একটি ডিজাইন প্যাটার্ন যা দুটি কাজ করে:-
এটি গ্যারান্টি দেয় যে ক্লাসের শুধুমাত্র একটি উদাহরণ থাকবে।
-
এটি সেই দৃষ্টান্তে বিশ্বব্যাপী অ্যাক্সেসের একক পয়েন্ট প্রদান করে।
-
একজন প্রাইভেট কনস্ট্রাক্টর। এটি ক্লাসের বাইরে ক্লাসের বস্তু তৈরি করার ক্ষমতাকে সীমিত করে।
-
একটি পাবলিক স্ট্যাটিক পদ্ধতি যা ক্লাসের উদাহরণ প্রদান করে। এই পদ্ধতিটিকে getInstance বলা হয় । এটি ক্লাস ইনস্ট্যান্সে বিশ্বব্যাপী অ্যাক্সেসের বিন্দু।
বাস্তবায়নের বিকল্প
সিঙ্গলটন ডিজাইন প্যাটার্ন বিভিন্ন উপায়ে প্রয়োগ করা হয়। প্রতিটি বিকল্প তার নিজস্ব উপায়ে ভাল এবং খারাপ। সর্বদা হিসাবে, এখানে কোন নিখুঁত বিকল্প নেই, তবে আমাদের একটির জন্য প্রচেষ্টা করা উচিত। প্রথমত, আসুন সিদ্ধান্ত নেওয়া যাক কি ভাল এবং মন্দ গঠন করে এবং কোন মেট্রিক্সগুলিকে প্রভাবিত করে কিভাবে আমরা ডিজাইন প্যাটার্নের বিভিন্ন বাস্তবায়নকে মূল্যায়ন করি। এর ভালো দিয়ে শুরু করা যাক. এখানে এমন কারণগুলি রয়েছে যা একটি বাস্তবায়নকে আরও সরস এবং আকর্ষণীয় করে তোলে:-
অলস প্রাথমিককরণ: দৃষ্টান্তটি প্রয়োজন না হওয়া পর্যন্ত তৈরি করা হয় না।
-
সহজ এবং স্বচ্ছ কোড: এই মেট্রিক, অবশ্যই, বিষয়গত, কিন্তু এটি গুরুত্বপূর্ণ।
-
থ্রেড নিরাপত্তা: মাল্টি-থ্রেডেড পরিবেশে সঠিক অপারেশন।
-
একটি মাল্টি-থ্রেডেড পরিবেশে উচ্চ কার্যকারিতা: সম্পদ ভাগ করার সময় সামান্য বা কোনো থ্রেড ব্লক করা হয় না।
-
কোন অলস প্রারম্ভিকতা: যখন ক্লাস লোড হয় যখন অ্যাপ্লিকেশন শুরু হয়, তা নির্বিশেষে এটির প্রয়োজন আছে কিনা (বিরোধপূর্ণভাবে, আইটি জগতে অলস হওয়া ভাল)
-
জটিল এবং কঠিন-পঠন কোড। এই মেট্রিকটিও বিষয়ভিত্তিক। যদি আপনার চোখ থেকে রক্তপাত শুরু হয়, তাহলে আমরা ধরে নেব বাস্তবায়নটি সেরা নয়।
-
থ্রেড নিরাপত্তার অভাব। অন্য কথায়, "থ্রেড বিপদ"। মাল্টি-থ্রেডেড পরিবেশে ভুল অপারেশন।
-
মাল্টি-থ্রেডেড পরিবেশে খারাপ পারফরম্যান্স: থ্রেডগুলি একে অপরকে সব সময় বা প্রায়শই একটি সংস্থান ভাগ করার সময় ব্লক করে।
কোড
এখন আমরা বিভিন্ন বাস্তবায়ন বিকল্প বিবেচনা করতে প্রস্তুত এবং সুবিধা এবং অসুবিধাগুলি নির্দেশ করি:সরল
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
সবচেয়ে সহজ বাস্তবায়ন। সুবিধা:
-
সহজ এবং স্বচ্ছ কোড
-
থ্রেড নিরাপত্তা
-
একটি মাল্টি থ্রেড পরিবেশে উচ্চ কর্মক্ষমতা
- কোন অলস সূচনা.
অলস সূচনা
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
সুবিধা:
-
অলস সূচনা.
-
থ্রেড নিরাপদ নয়
সিঙ্ক্রোনাইজড অ্যাক্সেস
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
সুবিধা:
-
অলস সূচনা.
-
থ্রেড নিরাপত্তা
-
দুর্বল মাল্টিথ্রেড কর্মক্ষমতা
ডবল চেক লকিং
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
সুবিধা:
-
অলস সূচনা.
-
থ্রেড নিরাপত্তা
-
একটি মাল্টি থ্রেড পরিবেশে উচ্চ কর্মক্ষমতা
-
1.5 এর নিচে জাভার আগের সংস্করণে সমর্থিত নয় (1.5 সংস্করণ থেকে উদ্বায়ী কীওয়ার্ডের ব্যবহার স্থির করা হয়েছে)
ক্লাস হোল্ডার
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
সুবিধা:
-
অলস সূচনা.
-
থ্রেড নিরাপত্তা.
-
একটি মাল্টি থ্রেড পরিবেশে উচ্চ কর্মক্ষমতা.
-
সঠিক ক্রিয়াকলাপের জন্য একটি গ্যারান্টি প্রয়োজন যে সিঙ্গেলটন অবজেক্টটি ত্রুটি ছাড়াই শুরু হয়েছে। অন্যথায়, getInstance পদ্ধতিতে প্রথম কলের ফলে একটি ExceptionInInitializerError হবে, এবং পরবর্তী সমস্ত কল একটি NoClassDefFoundError তৈরি করবে ।
বাস্তবায়ন | অলস সূচনা | থ্রেড নিরাপত্তা | মাল্টিথ্রেডেড কর্মক্ষমতা | কখন ব্যবহার করতে হবে? |
---|---|---|---|---|
সরল | - | + | দ্রুত | কখনই না। অথবা সম্ভবত যখন অলস প্রাথমিককরণ গুরুত্বপূর্ণ নয়। কিন্তু কখনও ভাল হবে না. |
অলস সূচনা | + | - | প্রযোজ্য নয় | সর্বদা যখন মাল্টিথ্রেডিংয়ের প্রয়োজন হয় না |
সিঙ্ক্রোনাইজড অ্যাক্সেস | + | + | ধীর | কখনই না। অথবা সম্ভবত যখন মাল্টিথ্রেড কর্মক্ষমতা কোন ব্যাপার না. কিন্তু কখনও ভাল হবে না. |
ডবল চেক লকিং | + | + | দ্রুত | বিরল ক্ষেত্রে যখন সিঙ্গেলটন তৈরি করার সময় আপনাকে ব্যতিক্রমগুলি পরিচালনা করতে হবে (যখন ক্লাস হোল্ডার সিঙ্গেলটন প্রযোজ্য নয়) |
ক্লাস হোল্ডার | + | + | দ্রুত | যখনই মাল্টিথ্রেডিং প্রয়োজন হবে এবং একটি গ্যারান্টি রয়েছে যে সিঙ্গেলটন অবজেক্টটি সমস্যা ছাড়াই তৈরি হবে। |
সিঙ্গেলটন প্যাটার্নের সুবিধা এবং অসুবিধা
সাধারণভাবে, একটি সিঙ্গলটন ঠিক যা প্রত্যাশিত তা করে:-
এটি গ্যারান্টি দেয় যে ক্লাসের শুধুমাত্র একটি উদাহরণ থাকবে।
-
এটি সেই দৃষ্টান্তে বিশ্বব্যাপী অ্যাক্সেসের একক পয়েন্ট প্রদান করে।
-
একটি সিঙ্গলটন একক দায়িত্ব নীতি লঙ্ঘন করে: তার প্রত্যক্ষ দায়িত্ব ছাড়াও, সিঙ্গেলটন শ্রেণী দৃষ্টান্তের সংখ্যা নিয়ন্ত্রণ করে।
-
একটি সিঙ্গলটনের উপর একটি সাধারণ শ্রেণীর নির্ভরতা ক্লাসের পাবলিক চুক্তিতে দৃশ্যমান নয়।
-
গ্লোবাল ভেরিয়েবল খারাপ. শেষ পর্যন্ত, একটি সিঙ্গলটন একটি বিশাল বৈশ্বিক পরিবর্তনশীলে পরিণত হয়।
-
একটি সিঙ্গলটনের উপস্থিতি সামগ্রিকভাবে অ্যাপ্লিকেশনের পরীক্ষাযোগ্যতা এবং বিশেষভাবে সিঙ্গেলটন ব্যবহার করে এমন ক্লাসগুলিকে হ্রাস করে।
GO TO FULL VERSION