CodeGym /Java Blog /এলোমেলো /জাভা সিঙ্গেলটন ক্লাস
John Squirrels
লেভেল 41
San Francisco

জাভা সিঙ্গেলটন ক্লাস

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

জাভাতে সিঙ্গলটন কি?

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

  2. এটি সেই দৃষ্টান্তে বিশ্বব্যাপী অ্যাক্সেসের একক পয়েন্ট প্রদান করে।

সুতরাং, সিঙ্গলটন প্যাটার্নের প্রায় প্রতিটি বাস্তবায়নের বৈশিষ্ট্যযুক্ত দুটি বৈশিষ্ট্য রয়েছে:
  1. একজন প্রাইভেট কনস্ট্রাক্টর। এটি ক্লাসের বাইরে ক্লাসের বস্তু তৈরি করার ক্ষমতাকে সীমিত করে।

  2. একটি পাবলিক স্ট্যাটিক পদ্ধতি যা ক্লাসের উদাহরণ প্রদান করে। এই পদ্ধতিটিকে 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;
  }
}
সুবিধা:
  • অলস সূচনা.

  • থ্রেড নিরাপত্তা

অসুবিধা:
  • দুর্বল মাল্টিথ্রেড কর্মক্ষমতা

চমৎকার! তিন নম্বর বাস্তবায়নে, আমরা থ্রেড নিরাপত্তা পুনরুদ্ধার করি! অবশ্যই, এটি ধীর... এখন getInstance পদ্ধতিটি সিঙ্ক্রোনাইজ করা হয়েছে, তাই এটি একবারে শুধুমাত্র একটি থ্রেড দ্বারা কার্যকর করা যেতে পারে। পুরো পদ্ধতিটি সিঙ্ক্রোনাইজ করার পরিবর্তে, আমাদের আসলে কেবলমাত্র এর অংশটি সিঙ্ক্রোনাইজ করতে হবে যা নতুন উদাহরণ শুরু করে। কিন্তু আমরা নতুন উদাহরণ তৈরির জন্য দায়ী অংশটি মোড়ানোর জন্য একটি সিঙ্ক্রোনাইজড ব্লক ব্যবহার করতে পারি না । এটি করা থ্রেড নিরাপত্তা নিশ্চিত করবে না। এটা সব একটু বেশি জটিল. সঠিক সিঙ্ক্রোনাইজেশন নীচে দেখা যেতে পারে:

ডবল চেক লকিং


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 সংস্করণ থেকে উদ্বায়ী কীওয়ার্ডের ব্যবহার স্থির করা হয়েছে)

মনে রাখবেন যে এই বাস্তবায়ন বিকল্পটি সঠিকভাবে কাজ করার জন্য, দুটি শর্তের মধ্যে একটি অবশ্যই সন্তুষ্ট হতে হবে। INSTANCE ভেরিয়েবল অবশ্যই চূড়ান্ত বা উদ্বায়ী হতে হবে আমরা আজ আলোচনা করব শেষ বাস্তবায়ন যে ক্লাস হোল্ডার singleton .

ক্লাস হোল্ডার


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 তৈরি করবে ।

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

সিঙ্গেলটন প্যাটার্নের সুবিধা এবং অসুবিধা

সাধারণভাবে, একটি সিঙ্গলটন ঠিক যা প্রত্যাশিত তা করে:
  1. এটি গ্যারান্টি দেয় যে ক্লাসের শুধুমাত্র একটি উদাহরণ থাকবে।

  2. এটি সেই দৃষ্টান্তে বিশ্বব্যাপী অ্যাক্সেসের একক পয়েন্ট প্রদান করে।

যাইহোক, এই প্যাটার্নের ত্রুটি রয়েছে:
  1. একটি সিঙ্গলটন একক দায়িত্ব নীতি লঙ্ঘন করে: তার প্রত্যক্ষ দায়িত্ব ছাড়াও, সিঙ্গেলটন শ্রেণী দৃষ্টান্তের সংখ্যা নিয়ন্ত্রণ করে।

  2. একটি সিঙ্গলটনের উপর একটি সাধারণ শ্রেণীর নির্ভরতা ক্লাসের পাবলিক চুক্তিতে দৃশ্যমান নয়।

  3. গ্লোবাল ভেরিয়েবল খারাপ. শেষ পর্যন্ত, একটি সিঙ্গলটন একটি বিশাল বৈশ্বিক পরিবর্তনশীলে পরিণত হয়।

  4. একটি সিঙ্গলটনের উপস্থিতি সামগ্রিকভাবে অ্যাপ্লিকেশনের পরীক্ষাযোগ্যতা এবং বিশেষভাবে সিঙ্গেলটন ব্যবহার করে এমন ক্লাসগুলিকে হ্রাস করে।

এবং এটাই! :) আমরা আপনার সাথে জাভা সিঙ্গেলটন ক্লাস অন্বেষণ করেছি। এখন, আপনার বাকি জীবনের জন্য, আপনার প্রোগ্রামার বন্ধুদের সাথে কথোপকথন করার সময়, আপনি প্যাটার্নটি কতটা ভাল তা উল্লেখ করতে পারেন না, তবে এটি কী খারাপ করে সে সম্পর্কে কয়েকটি শব্দও উল্লেখ করতে পারেন। সৌভাগ্য এই নতুন জ্ঞান আয়ত্ত.

অতিরিক্ত পড়া:

মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION