আপনি কি কখনো একটি ক্লাস তৈরি করতে চেয়েছেন যাতে শুধু একটি ইনস্ট্যান্স থাকতে পারে?
হ্যাঁ? না? হয়তো?
যদিও...
এটিই হলো সিঙ্গল্টন প্যাটার্ন।
এতে কোনো সমস্যা নেই।
কিন্তু কিছু লোক এটিকে একটি অ্যান্টি-প্যাটার্ন বলে কারণ এটি খারাপ ডিজাইনের জন্য অफ़সোস হিসেবে ব্যবহার হতে পারে।
আসুন একটি কোড উদাহরণ দেখি যাতে আপনি শিখতে পারেন এটি কীভাবে কাজ করে।
সিঙ্গল্টন প্যাটার্ন কোড উদাহরণ
সিঙ্গল্টন প্যাটার্নের ধারণা হলো আপনি একটি ক্লাস চান যার শুধু একটি ইনস্ট্যান্স থাকবে।
এটি কীভাবে:
- আপনি
newমেথডকে প্রাইভেট করেন - আপনি একটি ক্লাস মেথড সংজ্ঞায়িত করেন যার নাম
instanceযা ক্লাসের জন্য ইউনিক ইনস্ট্যান্স ফেরত দেয়
যেহেতু এটি একটি জনপ্রিয় ডিজাইন প্যাটার্ন, রুবি স্ট্যান্ডার্ড লাইব্রেরিতে একটি Singleton মডিউল আছে যা আপনি যেকোনো ক্লাসে ইনক্লুড করতে পারেন।
এটি এরকম দেখায়:
require 'singleton' class Shop include Singleton end
এখন যদি আপনি Shop.new দিয়ে একটি Shop অবজেক্ট তৈরি করার চেষ্টা করেন তবে আপনি এটি দেখবেন:
Shop.new # NoMethodError: private method `new' called for Shop:Class
এবং যদি আপনি একমাত্র Shop অবজেক্টটি পেতে চান তবে আপনি instance মেথড ব্যবহার করতে পারেন:
Shop.instance.object_id # 5659218 Shop.instance.object_id # 5659218
আপনি বুঝতে পারেন এটি সবসময় একই অবজেক্ট কারণ object_id কখনোই পরিবর্তন হয় না।
আপনার মনে রাখতে হবে:
এটি একটি সিম্পল প্যাটার্ন, এটি অবজেক্ট তৈরিকে ১টি অবজেক্টে সীমাবদ্ধ করে এবং আপনি যখন চান সেটি অনুরোধ করতে পারেন।
কেন আপনাকে এই প্যাটার্ন ব্যবহার করা উচিত নয়
সিঙ্গল্টন প্যাটার্ন প্রায়শই একটি গ্লোবাল ভেরিয়েবলের আকারে থাকার একটি অफ़সোস হিসেবে কাজ করে এবং আমরা জানি গ্লোবাল ভেরিয়েবল খারাপ কারণ আপনার ওপর কোনো কন্ট্রোল নেই। এতে টেস্ট করা কঠিন হয় এবং কাপলিং বাড়তে পারে।
"সিঙ্গল্টন-এর আসল সমস্যা হলো এটি আপনাকে এমন একটি ভালো অफ़সোস দেয় যে আপনি একটি অবজেক্টের উপযুক্ত ভিজিবিলিটি সম্পর্কে যত্ন पूर्वক চিন্তা করছেন না।" — কেন্ট বেক
কল্পনা করুন একটি অবজেক্ট আছে যার ওপর আপনার অধিকাংশ ক্লাস ডিপেন্ড করছে, সেটিই সিঙ্গল্টন প্যাটার্নে পরিণত হতে পারে। সেটি রিফ্যাক্টর করার শুভকামনা!
এখন:
এই প্যাটার্নের কোনো ভালো ব্যবহার আছে কি?
গিটহাবে সার্চ করলে সিঙ্গল্টন প্যাটার্ন নাল অবজেক্ট প্যাটার্নের সাথে ব্যবহার করা কিছু রিপো পাওয়া গেলো।
আমি মনে করি এটা মেনে যায়, রেইলস এটি অ্যাকশনপ্যাকের অংশ হিসেবে ব্যবহার করে।
এখানে কোডটি:
class AllType < Type
include Singleton
def initialize
super "*/*", :all
end
def all?; true; end
def html?; true; end
end
এটি একটি ক্লাস যা Type-র থেকে ইনহেরিট করেছে।
যখন আপনি instance মেথড দিয়ে একটি AllType অবজেক্ট তৈরি করেন, এটি সুপার কল করে এবং অবজেক্টটি ফেরত দেয়।
उसके পরে প্রতি বার আপনি instance কল করলে আপনি একই অবজেক্ট পাবেন।
উপসংহারে:
হ্যাঁ, এই প্যাটার্ন সঠিক পরিস্থিতিতে উপকারী হতে পারে, কিন্তু আপনি এটি অনেক চিন্তা না করে ব্যবহার করতে চাবেন না।
ভিডিও
সারসংক্ষেপ
আপনি সিঙ্গল্টন ডিজাইন প্যাটার্ন সম্পর্কে শিখতে পেরেছেন, কীভাবে রুবিতে এটি ইমপ্লিমেন্ট করবেন এবং অধিকাংশ সময় কেন এটিকে এড়ানো উচিত।
আপনি এই প্যাটার্ন সম্পর্কে কী মনে করেন? কি আগে দেখেছেন? কমেন্টে জানান 🙂
পড়ার জন্য ধন্যবাদ!