design patterns - স্ট্যাটিক ক্লাস এবং একক্টন প্যাটার্ন মধ্যে পার্থক্য?




design-patterns static (20)

  1. Singleton বস্তু হিপ মধ্যে সংরক্ষিত হয়, কিন্তু স্ট্যাটিক বস্তু স্ট্যাক মধ্যে সংরক্ষিত হয়।
  2. আমরা ক্লোন করতে পারি (যদি ডিজাইনার এটি অস্বীকার না করে) একক্টোন বস্তু, তবে আমরা স্ট্যাটিক ক্লাস অবজেক্ট ক্লোন করতে পারি না।
  3. সিঙ্গলটন ক্লাসগুলি OOP (বস্তু ভিত্তিক নীতি) অনুসরণ করে, স্ট্যাটিক ক্লাসগুলি না।
  4. আমরা সিঙ্গল্টন ক্লাসের সাথে একটি interface বাস্তবায়ন করতে পারি, তবে একটি ক্লাসের স্ট্যাটিক পদ্ধতি (অথবা উদাহরণস্বরূপ একটি C # static class ) করতে পারে না।

একটি স্ট্যাটিক ক্লাস এবং একটি সিঙ্গল্টন প্যাটার্ন মধ্যে বাস্তব কি (অর্থাত্ বাস্তব) পার্থক্য বিদ্যমান?

উভয় তাত্ক্ষণিকতা ছাড়া আহ্বান করা যেতে পারে, উভয় শুধুমাত্র একটি "ইনস্ট্যান্স" প্রদান এবং তাদের মধ্যে কেউ থ্রেড-নিরাপদ। অন্য কোন পার্থক্য আছে কি?


  1. Lazy লোড হচ্ছে
  2. ইন্টারফেস সমর্থন, যাতে পৃথক বাস্তবায়ন প্রদান করা যেতে পারে
  3. প্রাপ্তির ধরনটি ফেরত দেওয়ার ক্ষমতা (Lazyloading এবং ইন্টারফেস বাস্তবায়ন সমন্বয় হিসাবে)

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


আপনি কি বলছেন যে একটি সিঙ্গলটন বা স্ট্যাটিক পদ্ধতি থ্রেড-নিরাপদ নয়? সাধারণত উভয় থ্রেড-নিরাপদ হতে প্রয়োগ করা উচিত

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


একটি সিঙ্গল্টনের আরেকটি সুবিধা হল এটি সহজেই সিরিয়ালাইজড হতে পারে, যদি আপনার ডিস্কটিকে তার ডিস্কে সংরক্ষণ করতে হয় অথবা এটি দূরবর্তী স্থানে কোথাও পাঠানো দরকার।


একটি স্ট্যাটিক ক্লাস শুধুমাত্র স্ট্যাটিক পদ্ধতি রয়েছে, যার জন্য একটি ভাল শব্দ "ফাংশন" হবে। একটি স্ট্যাটিক ক্লাস embodied নকশা শৈলী বিশুদ্ধরূপে প্রক্রিয়াগত হয়।

অন্য দিকে, সিঙ্গলটন, OO নকশা নির্দিষ্ট একটি প্যাটার্ন। এটি একটি বস্তুর একটি দৃষ্টান্ত (যেমন পলিমারফিজম হিসাবে অন্তর্গত সমস্ত সম্ভাবনার সাথে), একটি সৃষ্টি পদ্ধতির সাথে যা নিশ্চিত করে যে সারা জীবন জুড়ে সেই বিশেষ ভূমিকাটির শুধুমাত্র একটি উদাহরণ রয়েছে।


ওয়েল একটি সিঙ্গলটন শুধুমাত্র একটি স্বাভাবিক ক্লাস যা তাত্ক্ষণিকভাবে কিন্তু ক্লায়েন্ট কোড থেকে কেবল একবার এবং পরোক্ষভাবে হয়। স্ট্যাটিক ক্লাস instantiated হয় না। যতদূর আমি স্ট্যাটিক পদ্ধতি জানি (স্ট্যাটিক ক্লাস স্ট্যাটিক পদ্ধতি থাকতে হবে) অ স্ট্যাটিক চেয়ে দ্রুত।

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


ক। সিরিয়ালাইজেশন - স্ট্যাটিক সদস্যরা ক্লাসের অন্তর্গত এবং তাই সিরিয়ালাইজড করা যাবে না।

খ। যদিও আমরা কনস্ট্রাক্টরকে ব্যক্তিগত বানিয়েছি, স্ট্যাটিক সদস্যের ভেরিয়েবল এখনও সাবক্লাসে নিয়ে যাবে।

গ। আমরা অলস সূচনা করতে পারি না কারণ সবকিছুই কেবল ক্লাস লোডিংয়ে লোড করা হবে।


সত্য উত্তর Jon Skeet দ্বারা, এখানে অন্য ফোরামে

একটি সিঙ্গলটন একটি একক তৈরি ইনস্ট্যান্সের অ্যাক্সেসের অনুমতি দেয় - যে উদাহরণটি (অথবা বরং, সেই দৃষ্টান্তের একটি রেফারেন্স) অন্যান্য পদ্ধতিতে পরামিতি হিসাবে পাস করা যেতে পারে এবং সাধারণ বস্তুর হিসাবে বিবেচিত হতে পারে।

একটি স্ট্যাটিক ক্লাস শুধুমাত্র স্ট্যাটিক পদ্ধতি অনুমতি দেয়।


সিঙ্গলটন এর তাত্ক্ষণিক, এটি শুধুমাত্র এক ইনস্ট্যান্ট তাত্ক্ষণিক হয়, তাই একক সিঙ্গলন।

একটি স্ট্যাটিক ক্লাস নিজেই ছাড়া অন্য কিছু দ্বারা instantiated করা যাবে না।


সিঙ্গল্টন প্যাটার্নে আপনি সিঙ্গলটনটি তৈরি হওয়া প্রকারের উদাহরণ হিসাবে তৈরি করতে পারেন, আপনি স্ট্যাটিক ক্লাসের সাথে এটি করতে পারবেন না।

দ্রুত উদাহরণ:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

static ক্লাসগুলির কোনও অবস্থা দরকার না, এটি একসাথে ফাংশন গুচ্ছ একত্রিত করার জন্য উপকারী, অর্থাত Math (বা প্রকল্পগুলিতে ব্যবহার করা)। সুতরাং ক্লাসের নামটি কেবল আমাদের একটি সূত্র দেয় যেখানে আমরা ফাংশন খুঁজে পেতে পারি এবং আরো কিছুই নেই।

Singleton আমার পছন্দের প্যাটার্ন এবং এটি একটি একক বিন্দুতে কিছু পরিচালনা করার জন্য ব্যবহার করুন। এটা static ক্লাসের চেয়ে আরও নমনীয় এবং রাষ্ট্র বজায় রাখতে পারেন। এটা ইন্টারফেস বাস্তবায়ন করতে পারেন, অন্যান্য ক্লাস থেকে উত্তরাধিকার এবং উত্তরাধিকার অনুমতি।

static এবং singleton মধ্যে নির্বাচন করার জন্য আমার নিয়ম:

যদি ফাংশন গুচ্ছ একসঙ্গে রাখা উচিত, তারপর static পছন্দ। অন্য কিছু যা কিছু সংস্থানে একক অ্যাক্সেস প্রয়োজন, singleton বাস্তবায়ন করা যেতে পারে।


অনেক ক্ষেত্রে, এই দুটিগুলির মধ্যে কোনও পার্থক্য নেই, বিশেষত যদি সিঙ্গলটনের উদাহরণ কখনও পরিবর্তন না করে বা খুব ধীরে ধীরে পরিবর্তিত হয় যেমন কনফিগারেশন ধারণ করে।

আমি বলব সবচেয়ে বড় পার্থক্য হল সিঙ্গলটন এখনও একটি সাধারণ জাভা বীন যা একটি নির্দিষ্ট স্ট্যাটিক-একমাত্র জাভা বর্গের বিরোধিতা করে। এবং এই কারণে, একক্টনকে আরো অনেক পরিস্থিতিতে গ্রহণ করা হয়; এটা আসলে ডিফল্ট স্প্রিং ফ্রেমওয়ার্ক এর তাত্ক্ষণিক কৌশল। ভোক্তা হয়তো জানেন না যে এটি একটি সিঙ্গলটন কাছাকাছি পার হচ্ছে, এটি কেবল স্বাভাবিক জাভা বীজের মত আচরণ করে। প্রয়োজন পরিবর্তিত হলে এবং একটি সিঙ্গলটনের পরিবর্তে প্রোটোটাইপ হতে হবে, যেমন আমরা প্রায়ই স্প্রিং দেখতে পাই, এটি গ্রাহকের কাছে কোড পরিবর্তনের লাইন ছাড়া সম্পূর্ণরূপে নির্বিশেষে করা যেতে পারে।

অন্য কেউ আগে উল্লেখ করেছে যে একটি স্ট্যাটিক ক্লাস বিশুদ্ধরূপে প্রক্রিয়াজাতকরণ যেমন java.lang.Math করা উচিত। আমার মনের মধ্যে, এই ধরনের একটি শ্রেণী প্রায় কখনও পাস করা উচিত নয় এবং তারা গুণাবলী হিসাবে স্ট্যাটিক চূড়ান্ত ছাড়া অন্য কিছু রাখা উচিত নয়। অন্য সবকিছুর জন্য, একটি সিঙ্গলটন ব্যবহার করুন কারণ এটি আরও বেশি নমনীয় এবং বজায় রাখা সহজ।


আমাদের ডিবি ফ্রেমওয়ার্ক রয়েছে যা ব্যাক এন্ডের সাথে সংযোগ করে তোলে। একাধিক ব্যবহারকারীদের মধ্যে নোংরা পঠন এড়িয়ে চলতে আমরা একক সময়ে উপলব্ধ একক উদাহরণ নিশ্চিত করতে এককোন প্যাটার্ন ব্যবহার করেছি।

সি # একটি স্ট্যাটিক ক্লাস একটি ইন্টারফেস বাস্তবায়ন করতে পারবেন না। যখন একটি একক ইনস্ট্যান্স ক্লাসের জন্য একটি ব্যবসায়িক চুক্তি বা আইওসি উদ্দেশ্যে একটি ইন্টারফেস বাস্তবায়ন করতে হয়, তখনই আমি স্ট্যাটিক ক্লাস ছাড়াই সিঙ্গলটন প্যাটার্ন ব্যবহার করি

Singleton স্টেটহীন অবস্থায় রাষ্ট্র বজায় রাখার জন্য একটি উপায় প্রদান করে

আশা করি যে তোমাকে সাহায্য করবে ..


আমি নিম্নলিখিত পড়া এবং এটি খুব ইন্দ্রিয় তোলে মনে হয়:

ব্যাবসার দেখাশোনা করা

মনে রাখবেন, সবচেয়ে গুরুত্বপূর্ণ OO নিয়মগুলির মধ্যে একটি হল যে একটি বস্তু নিজের জন্য দায়ী। এর মানে ক্লাসের জীবনচক্র সম্পর্কিত বিষয়গুলি ক্লাসে পরিচালনা করা উচিত, স্ট্যাটিকের মতো ভাষা গঠনের জন্য নয়, ইত্যাদি।

বই থেকে অবজেক্ট-ওরিয়েন্টেড থট প্রসেস 4 র্থ এড।


আমি লিখেছি এমন একটি নিবন্ধে সিঙ্গলটন স্ট্যাটিক ক্লাসের তুলনায় অনেক ভাল কেন সে সম্পর্কে আমার দৃষ্টিভঙ্গি বর্ণনা করেছে:

  1. স্ট্যাটিক ক্লাস প্রকৃতপক্ষে ক্যাননিক ক্লাস নয় - এটি একটি নামস্থান এবং ফাংশন সহ ভেরিয়েবল
  2. স্ট্যাটিক ক্লাস ব্যবহার করে বস্তু-ভিত্তিক প্রোগ্রামিং নীতিগুলি ভাঙ্গার জন্য একটি ভাল অনুশীলন নয়
  3. স্ট্যাটিক ক্লাস অন্যান্য জন্য একটি পরামিতি হিসাবে পাস করা যাবে না
  4. স্ট্যাটিক ক্লাস "অলস" প্রারম্ভিক জন্য উপযুক্ত নয়
  5. স্ট্যাটিক ক্লাসের সূচনা এবং ব্যবহার সর্বদা কঠিন ট্র্যাক করা হয়
  6. থ্রেড ব্যবস্থাপনা বাস্তবায়ন কঠিন

জন স্কিট এর উত্তর প্রসারিত করতে

একটি সিঙ্গলন এবং স্ট্যাটিক পদ্ধতিগুলির একটি গুচ্ছের মধ্যে বড় পার্থক্য হল এককটি ইন্টারফেসগুলি বাস্তবায়ন করতে পারে (অথবা কার্যকর বেস ক্লাসগুলি থেকে প্রাপ্ত, যদিও এটি কম সাধারণ আইএমই) তবে এটি এককভাবে "একমাত্র" বাস্তবায়ন হিসাবে আপনি সিঙ্গলটনের কাছাকাছি যেতে পারেন।

একক পরীক্ষার একক যখন ইউনিট সঙ্গে কাজ করতে সহজ। যেখানেই আপনি একটি প্যারামিটার (কন্সট্রাক্টরস, সেট্টারস বা পদ্ধতি) হিসাবে সিঙ্গলনগুলি পাস করেন তবে আপনি পরিবর্তে সিঙ্গলটনের একটি মাকড বা স্টাবড সংস্করণটি প্রতিস্থাপন করতে পারেন।


প্রধান পার্থক্য হল:

  • স্ট্যাটিক ক্লাস স্ট্যাটিক পদ্ধতির একটি গুচ্ছ যখন Singleton একটি উদাহরণ / বস্তু আছে
  • স্ট্যাটিক ক্লাস হতে পারে না, যদিও একটি ইন্টারফেস মাধ্যমে Singleton বর্ধিত করা যেতে পারে।
  • এককভাবে উত্তরাধিকারী উত্তরাধিকারী হতে পারে যা SOLID নীতিগুলিতে খোলা / ঘনিষ্ঠ নীতিগুলি সমর্থন করে তবে স্ট্যাটিক ক্লাসটি উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে না এবং আমাদের অবশ্যই পরিবর্তনগুলি করতে হবে।
  • স্ট্যাটিক ক্লাস হিসাবে এটি একটি উদাহরণ আছে না যখন Singleton বস্তু পদ্ধতিতে পাস করা যাবে পরামিতি হিসাবে পাস করা যাবে না

একটি স্ট্যাটিক ক্লাসের উদাহরণের মধ্যে একটি বিশাল পার্থক্য রয়েছে (অর্থাৎ, একটি শ্রেণির একটি উদাহরণ যা স্ট্যাটিক বা গ্লোবাল ভেরিয়েবল হতে পারে) এবং হিপের ক্লাসের একটি দৃষ্টান্তের জন্য একটি স্ট্যাটিক পয়েন্টার :

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


একটি ক্লায়েন্ট দৃষ্টিকোণ থেকে, স্ট্যাটিক আচরণ ক্লায়েন্ট পরিচিত কিন্তু একক ক্লায়েন্ট থেকে লুকানো সম্পন্ন করা যেতে পারে Singleton আচরণ। ক্লায়েন্ট কখনোই জানেন না যে তিনি কেবল একবারই একসাথে খেলছেন।





singleton