CodeGym /Java Blog /এলোমেলো /জাভাতে প্যাটার্নস এবং সিঙ্গেলটন
John Squirrels
লেভেল 41
San Francisco

জাভাতে প্যাটার্নস এবং সিঙ্গেলটন

এলোমেলো দলে প্রকাশিত
এই নিবন্ধটি এমন যেকোনও ব্যক্তিকে লক্ষ্য করে যারা, প্রথমবারের মতো ডিজাইন প্যাটার্নের ধারণার সম্মুখীন হচ্ছেন, সিঙ্গেলটন শব্দটি শুনেছেন , বা কোনোভাবে সিঙ্গেলটন প্যাটার্ন প্রয়োগ করেছেন কিন্তু বুঝতে পারছেন না কি ঘটছে। স্বাগত! কোডজিম শিক্ষার্থীরা লেভেল 15-এ প্রথমবারের মতো ডিজাইনের প্যাটার্নের মুখোমুখি হয়, যখন ক্যাপ্টেন অপ্রত্যাশিতভাবে তাদের অলস বাস্তবায়নের সাথে জাভা সিঙ্গেলটন প্যাটার্ন বাস্তবায়নের মাধ্যমে তাদের বোঝার "শক্তিশালী" করতে বলেন। প্রথমবারের মতো সিঙ্গেলটন প্যাটার্ন সম্পর্কে শুনে ছাত্রদের তাত্ক্ষণিকভাবে অনেক প্রশ্ন থাকে: বিশ্বে একটি ডিজাইন প্যাটার্ন কী? কেন এটা আমাদের দরকার? সিঙ্গলটন কি ? এবং অবশেষে, অলস বাস্তবায়ন কি? আসুন ক্রমানুসারে এই প্রশ্নের উত্তর দেওয়া যাক।

বিশ্বের একটি নকশা প্যাটার্ন কি?

আমি বিশ্বাস করি একটি সামান্য ইতিহাস সর্বোত্তম বোঝার সাথে এই প্রশ্নের উত্তর দেওয়ার জন্য। চারজন বিখ্যাত প্রোগ্রামিং লেখক (এরিখ গামা, জন ভিলিসাইডস, রাল্ফ জনসন এবং রিচার্ড হেলম) একটি আকর্ষণীয় ধারণা নিয়ে এসেছেন। তারা লক্ষ্য করেছে যে সফ্টওয়্যার বিকাশের জন্য প্রায়শই তাদের প্রায় একই সমস্যাগুলি সমাধান করতে এবং একইভাবে কাঠামোগত কোড লিখতে হয়। তাই তারা সাধারণ নিদর্শনগুলি বর্ণনা করার সিদ্ধান্ত নিয়েছে যা প্রায়শই অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে ব্যবহার করা প্রয়োজন। তাদের বইটি 1994 সালে ডিজাইন প্যাটার্নস: এলিমেন্টস অফ রিইউজেবল অবজেক্ট-ওরিয়েন্টেড সফটওয়্যার শিরোনামে প্রকাশিত হয়েছিল। বইটির নামটি খুব দীর্ঘ হয়ে গেছে এবং লোকেরা এটিকে কেবল গ্যাং অফ ফোর বই বলে ডাকতে শুরু করেছে। প্রথম সংস্করণ 23 নিদর্শন অন্তর্ভুক্ত. পরে, আরও কয়েক ডজন নিদর্শন আবিষ্কৃত হয়েছিল।
একটি ডিজাইন প্যাটার্ন একটি সাধারণ সমস্যার একটি প্রমিত সমাধান।
এবং সিঙ্গেলটন প্যাটার্ন তাদের মধ্যে একটি।

কেন আমরা নকশা নিদর্শন প্রয়োজন?

আপনি প্যাটার্নগুলি না জেনেই প্রোগ্রাম করতে পারেন: সর্বোপরি, লেভেল 15 দ্বারা, আপনি ইতিমধ্যেই কোডজিমে শত শত মিনি-প্রোগ্রাম লিখে ফেলেছেন এমনকি সেগুলি বিদ্যমান তা না জেনেও। এটি পরামর্শ দেয় যে ডিজাইনের নিদর্শনগুলি হল এক ধরণের সরঞ্জাম যার ব্যবহার মাস্টারকে অপেশাদার থেকে আলাদা করে: ডিজাইনের নিদর্শনগুলি বর্ণনা করে যে কীভাবে একটি সাধারণ সমস্যা সঠিকভাবে সমাধান করা যায়। এর মানে হল যে প্যাটার্ন জানা আপনার সময় বাঁচায়। এই ভাবে, তারা অ্যালগরিদম অনুরূপ. উদাহরণস্বরূপ, আপনি ব্ল্যাকজ্যাক এবং সংখ্যা দিয়ে আপনার নিজস্ব সাজানোর অ্যালগরিদম তৈরি করতে পারেনএবং এটি করার জন্য অনেক সময় ব্যয় করুন, অথবা আপনি এমন একটি বাস্তবায়ন করতে পারেন যা দীর্ঘদিন ধরে বোঝা এবং বর্ণনা করা হয়েছে। ডিজাইন প্যাটার্নের ক্ষেত্রেও একই কথা। অতিরিক্তভাবে, নকশার প্যাটার্নের সাথে, কোডটি আরও মানক হয়ে ওঠে এবং উপযুক্ত প্যাটার্ন ব্যবহার করার সময়, আপনার ভুল হওয়ার সম্ভাবনা কম, যেহেতু প্যাটার্নের সাধারণ ত্রুটিগুলি চিহ্নিত করা হয়েছিল এবং অনেক আগেই দূর করা হয়েছিল। অন্য সবকিছুর উপরে, প্যাটার্নের জ্ঞান প্রোগ্রামারদের একে অপরকে আরও ভালভাবে বুঝতে সাহায্য করে। আপনি আপনার সহকর্মী প্রোগ্রামারদের একটি দীর্ঘ ব্যাখ্যা প্রদান করার পরিবর্তে একটি প্যাটার্নের নাম বলতে পারেন। সংক্ষেপে, নকশার নিদর্শন আপনাকে সাহায্য করে:
  • চাকা পুনরায় উদ্ভাবন করবেন না, তবে পরিবর্তে স্ট্যান্ডার্ড সমাধান ব্যবহার করুন;
  • প্রমিতকরণ কোড;
  • পরিভাষা প্রমিত করা;
এই বিভাগটি শেষ করার জন্য, আমরা লক্ষ্য করি যে নকশার প্যাটার্নের পুরো অংশটিকে তিনটি বড় গ্রুপে ভাগ করা যেতে পারে: প্যাটার্নস এবং সিঙ্গেলটন - প্রত্যেকের জন্য যারা প্রথমবার তাদের মুখোমুখি হয় - 2

অবশেষে, সিঙ্গেলটন প্যাটার্ন

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

  2. যখন আপনাকে একটি বস্তুতে বিশ্বব্যাপী অ্যাক্সেসের জন্য একটি বিন্দু প্রদান করতে হবে। অন্য কথায়, আপনাকে প্রোগ্রামের যেকোনো জায়গা থেকে অবজেক্টটি উপলব্ধ করতে হবে। হায়, শুধুমাত্র একটি গ্লোবাল ভেরিয়েবল তৈরি করা যথেষ্ট নয়, যেহেতু এটি লিখন-সুরক্ষিত নয়: যে কেউ ভেরিয়েবলের মান পরিবর্তন করতে পারে, তাই অবজেক্টের গ্লোবাল অ্যাক্সেস পয়েন্টটি হারিয়ে যেতে পারে। সিঙ্গেলটনের এই বৈশিষ্ট্যগুলি প্রয়োজনীয়, উদাহরণস্বরূপ, যখন আপনার কাছে একটি বস্তু থাকে যা একটি ডাটাবেসের সাথে কাজ করে এবং আপনাকে প্রোগ্রামের বিভিন্ন অংশ থেকে ডাটাবেস অ্যাক্সেস করতে হবে। একটি সিঙ্গেলটন নিশ্চিত করবে যে কেউ এমন কোড লিখবে না যা পূর্বে তৈরি করা উদাহরণটিকে প্রতিস্থাপন করে।
সুতরাং একজন সিঙ্গেলটন এই দুটি চাহিদাকে সন্তুষ্ট করেছেন: প্রোগ্রামে একটি নির্দিষ্ট ধরণের বস্তুর মধ্যে একটি অবশ্যই থাকতে হবে এবং এটিতে অবশ্যই বিশ্বব্যাপী অ্যাক্সেস থাকতে হবে। লেভেল 15-এর উদাহরণে, ক্যাপ্টেন আপনাকে নিম্নলিখিত কাজের জন্য এই প্যাটার্নটি বাস্তবায়ন করতে বলে:
  1. অলস প্রাথমিককরণ সহ সিঙ্গেলটনের একটি উদাহরণ খুঁজুন ।

  2. তিনটি সিঙ্গলটন ক্লাস তৈরি করুন — সূর্য, চাঁদ, পৃথিবী — একই নীতি ব্যবহার করে আলাদা ফাইলে।

  3. বাস্তবায়ন করুনগ্রহসূর্য , চাঁদ এবং পৃথিবীর ক্লাসে ইন্টারফেস ।

  4. সমাধান ক্লাসের স্ট্যাটিক ব্লকে কল করুনreadKeyFromConsoleAndInitPlanetপদ্ধতি

  5. বাস্তবায়নreadKeyFromConsoleAndInitPlanetপদ্ধতি কার্যকারিতা:

    • 5.1। কনসোল থেকে একটি স্ট্রিং প্যারামিটার পড়ুন

    • 5.2। যদি প্যারামিটারটি একটির সমান হয়গ্রহইন্টারফেসের ধ্রুবক, উপযুক্ত প্ল্যানেট অবজেক্ট তৈরি করুন।

টাস্ক শর্তগুলি মনোযোগ সহকারে পড়ার পরে, আমরা স্পষ্টভাবে দেখতে পাচ্ছি যে কেন এখানে একটি সিঙ্গেলটন প্রয়োজন। প্রকৃতপক্ষে, আমাদের নিম্নলিখিত শ্রেণীর প্রতিটির একটি উদাহরণ তৈরি করতে বলা হয়েছে: সূর্য , চাঁদ , পৃথিবী । এটা অনুমান করা বোধগম্য যে আমাদের একের বেশি সূর্য/চাঁদ/পৃথিবী তৈরি করা উচিত নয়। অন্যথায়, আমরা একটি অযৌক্তিক পরিস্থিতির মধ্যে পড়ি, যদি না অবশ্যই আপনি স্টার ওয়ার্স-এর সংস্করণটি লিখছেন। জাভাতে তিন ধাপে সিঙ্গেলটন প্যাটার্ন বাস্তবায়ন করা জাভাতে, সিঙ্গেলটন আচরণ একটি সাধারণ কনস্ট্রাক্টর ব্যবহার করে প্রয়োগ করা যায় না, কারণ একজন কনস্ট্রাক্টর সবসময় একটি নতুন বস্তু ফেরত দেয়। অতএব, সিঙ্গলটনের সমস্ত বাস্তবায়নকনস্ট্রাক্টরকে লুকিয়ে রাখতে, একটি পাবলিক স্ট্যাটিক পদ্ধতি তৈরি করে যা সিঙ্গলটন অবজেক্টের লাইফটাইমকে নিয়ন্ত্রণ করে এবং নতুন উপস্থিত হওয়া সমস্ত বস্তুকে "ধ্বংস" করে। যদি একটি সিঙ্গেলটন অ্যাক্সেস করা হয়, এটি হয় একটি নতুন বস্তু তৈরি করা উচিত (যদি একটি প্রোগ্রামে ইতিমধ্যেই বিদ্যমান না থাকে), অথবা একটি বিদ্যমান একটি ফিরিয়ে দিতে হবে। এটি সম্পন্ন করতে:
  1. আপনাকে ক্লাসটিকে একটি ব্যক্তিগত স্ট্যাটিক ক্ষেত্র দিতে হবে যা একটি একক বস্তু সঞ্চয় করে:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. (ডিফল্ট) কনস্ট্রাক্টরকে ব্যক্তিগত করুন। এর মানে হল যে এটি ক্লাসের বাইরে অ্যাক্সেস করা যাবে না এবং নতুন বস্তু ফেরত দিতে সক্ষম হবে না:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. একটি স্ট্যাটিক তৈরির পদ্ধতি ঘোষণা করুন যা সিঙ্গলটন পেতে ব্যবহার করা হবে:

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
উপরের উদাহরণটি কিছুটা আনাড়ি, যেহেতু আমরা কেবল কনস্ট্রাক্টরকে লুকিয়ে রাখি এবং স্ট্যান্ডার্ড কনস্ট্রাক্টরের পরিবর্তে আমাদের নিজস্ব পদ্ধতি প্রদান করি। যেহেতু এই নিবন্ধটির লক্ষ্য CodeGym ছাত্ররা এই প্যাটার্নের (এবং সাধারণভাবে ডিজাইনের প্যাটার্ন) এর সংস্পর্শে আসে তা নিশ্চিত করা, তাই আরও জটিল সিঙ্গেলটন বাস্তবায়নের সূক্ষ্মতা এখানে বর্ণনা করা হবে না। আমরা শুধুমাত্র নোট করি যে, প্রোগ্রামের জটিলতার উপর নির্ভর করে, এই প্যাটার্নটিকে আরও পরিমার্জিত করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, একটি মাল্টিথ্রেড পরিবেশে (থ্রেড সম্পর্কিত নিবন্ধগুলি দেখুন), বেশ কয়েকটি ভিন্ন থ্রেড একই সাথে সিঙ্গেলটন পদ্ধতিতে অ্যাক্সেস করতে পারে এবং উপরে বর্ণিত কোডটি কাজ করা বন্ধ করে দেবে, যেহেতু প্রতিটি পৃথক থ্রেড ক্লাসের একটি উদাহরণ তৈরি করতে পারে। ফলস্বরূপ, সঠিক থ্রেড-নিরাপদ সিঙ্গেলটন তৈরি করার জন্য এখনও বেশ কয়েকটি ভিন্ন পদ্ধতি রয়েছে। কিন্তু এটা অন্য গল্প =)

এবং পরিশেষে... এই অলস সূচনা কিসের ব্যাপারে অধিনায়ক জিজ্ঞেস করলেন?

অলস প্রারম্ভিকতাকে ডিফার্ড ইনিশিয়ালাইজেশনও বলা হয়। এটি একটি প্রোগ্রামিং কৌশল যেখানে একটি রিসোর্স-ইনটেনসিভ অপারেশন (এবং একটি অবজেক্ট তৈরি করা একটি রিসোর্স-ইনটেনসিভ অপারেশন) আগে থেকে না করে চাহিদা অনুযায়ী সঞ্চালিত হয়। তাই আসলে কি আমাদের সিঙ্গেলটন জাভা কোড ঘটবে? অন্য কথায়, আমাদের অবজেক্ট তৈরি হয় যখন এটি অ্যাক্সেস করা হয়, আগে থেকে নয়। আপনার অনুমান করা উচিত নয় যে অলস প্রারম্ভিকতা একরকম কঠোরভাবে সিঙ্গেলটন প্যাটার্নের সাথে আবদ্ধ । অলস প্রারম্ভিকতা অন্যান্য সৃজনশীল ডিজাইন প্যাটার্নগুলিতেও ব্যবহৃত হয়, যেমন প্রক্সি এবং ফ্যাক্টরি মেথড, তবে এটি অন্য গল্প =)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION