গত কয়েক মাস ধরে, আমি নিম্নলিখিত কৌশল / প্যাটার্নটি নিয়ে কয়েকবার হোঁচট খেয়েছি। তবে, আমি কোনও নির্দিষ্ট নাম খুঁজে পাচ্ছি না এবং এর সমস্ত সুবিধা এবং অসুবিধাগুলি সম্পর্কে আমি 100% নিশ্চিত নই।
নিদর্শনটি নিম্নরূপ:
একটি জাভা ইন্টারফেসের মধ্যে, সাধারণ পদ্ধতির একটি সেট যথারীতি সংজ্ঞায়িত করা হয়। যাইহোক, একটি অভ্যন্তর শ্রেণি ব্যবহার করে, একটি ডিফল্ট উদাহরণ ইন্টারফেসের মাধ্যমে ফাঁস হয়।
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
আমার জন্য, এটি মনে হয় যে সবচেয়ে বড় সুবিধাটি এই সত্যের মধ্যে রয়েছে যে কোনও বিকাশকারীকে কেবল ইন্টারফেস সম্পর্কে জানতে হবে এবং এর বাস্তবায়নগুলি নয়, উদাহরণস্বরূপ যদি তিনি দ্রুত কোনও উদাহরণ তৈরি করতে চান।
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
তদুপরি, আমি কনফিগারেশনের উপর নির্ভর করে গতিশীলভাবে উদাহরণ সরবরাহ করতে এই কৌশলটি স্প্রিংয়ের সাথে একত্রে ব্যবহৃত হতে দেখেছি। এই ক্ষেত্রে, দেখে মনে হচ্ছে এটি মডুলারাইজেশনে সহায়তা করতে পারে।
তবুও, আমি এই অনুভূতিটি কাঁপতে পারি না যে এটি ইন্টারফেসের অপব্যবহার কারণ এটি ইন্টারফেসটিকে এর একটির প্রয়োগের সাথে সংযুক্ত করে। (নির্ভরতা বিপরীকরণ নীতি ইত্যাদি।) কেউ কী দয়া করে আমাকে ব্যাখ্যা করতে পারবেন যে এই কৌশলটি কীভাবে বলা হয়, পাশাপাশি এর সুবিধা এবং অসুবিধাগুলিও?
হালনাগাদ:
কিছুক্ষণ বিবেচনার পরে, আমি আবার পরীক্ষা করে দেখেছি যে নীচের সিঙ্গলটন সংস্করণটি প্রায়শই ব্যবহৃত হত। এই সংস্করণে, একটি সার্বজনীন স্ট্যাটিক উদাহরণ ইন্টারফেসের মাধ্যমে উদ্ভাসিত হয় যা কেবল একবারই শুরু করা হয় (ক্ষেত্রটি চূড়ান্ত হওয়ার কারণে)। এছাড়াও, স্প্রিং বা জেনেরিক কারখানা ব্যবহার করে উদাহরণটি প্রায় সর্বদা পুনরুদ্ধার করা হয় যা প্রয়োগ থেকে ইন্টারফেসটিকে ডেসপুল করে।
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
সংক্ষেপে: মনে হচ্ছে এটি একটি কাস্টম সিঙ্গলটন / কারখানার প্যাটার্ন, যা মূলত তার ইন্টারফেসের মাধ্যমে কোনও উদাহরণ বা সিঙ্গলটন প্রকাশ করতে দেয়। অসুবিধাগুলি সম্পর্কে শ্রদ্ধার সাথে, নীচে কয়েকটি উত্তর ও মন্তব্যে নাম লেখা হয়েছে। এখনও পর্যন্ত, সুবিধাটি তার সুবিধার্থে থাকা বলে মনে হচ্ছে।
Vehicle.Default
একটি কারখানা বর্গ, যেমন যেমন প্যাকেজ নামস্থান মধ্যে সরানো পর্যন্ত দিতে হবে VehicleFactory
।
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()