স্থির পদ্ধতির পরিবর্তে কেন সিঙ্গলটন ব্যবহার করবেন?


94

সহায়ক / ইউটিলিটি ক্লাস সম্পর্কে এই সাধারণ প্রশ্নের ভাল উত্তর আমি কখনই পাইনি:

আমি স্থির পদ্ধতি ব্যবহারের পরিবর্তে কেন একটি সিঙ্গলটন (রাষ্ট্রবিহীন) তৈরি করব?

কোনও বস্তুর কোনও রাজ্য না থাকলে কেন কোনও বস্তুর উদাহরণের প্রয়োজন হবে?



ভাবুন না যেহেতু আমরা 2 টি আলাদা ল্যাংগের বিষয়ে কথা বলি যাতে উত্তরটি আলাদা হতে পারে তবে লিঙ্কটির জন্য ধন্যবাদ জাভাতে কখনই "মনস্টেট" শব্দটি শোনেনি
সেবাস্তিয়ান লরবার

উত্তর:


79

প্রায়শই, একক অ্যাপ্লিকেশনটির জন্য একরকম বিশ্বব্যাপী অবস্থা প্রবর্তনের জন্য সিলেটলেটন ব্যবহার করা হয় । (সত্যিকারের প্রয়োজনের চেয়ে প্রায়শই বেশি প্রয়োজন, তবে এটি অন্য সময়ের জন্য একটি বিষয়))

তবে কয়েকটি কর্নার কেস রয়েছে যেখানে স্টেটহীন সিঙ্গলটনও কার্যকর হতে পারে:

  • আপনি এটি প্রত্যাশিত ভবিষ্যতে রাষ্ট্রের সাথে প্রসারিত করার প্রত্যাশা করছেন।
  • কিছু বিশেষ প্রযুক্তিগত কারণে আপনার একটি অবজেক্ট উদাহরণ প্রয়োজন । উদাহরণ: সি # বা জাভা স্টেটমেন্টের জন্য সুসংগত বস্তু ।
    locksynchronized
  • আপনার উত্তরাধিকার প্রয়োজন, অর্থাত্‍, আপনি একই সিঙ্গেল ইন্টারফেসটি ব্যবহার করে অন্যরকম একটি প্রয়োগও ব্যবহার করে সহজেই আপনার সিঙ্গলটন প্রতিস্থাপন করতে সক্ষম হতে চান।
    উদাহরণ: Toolkit.getDefaultToolkit()জাভার পদ্ধতিটি এমন একক সিঙ্গলকে ফিরিয়ে দেবে যার সঠিক ধরণটি সিস্টেম নির্ভর।
  • আপনি একটি প্রেরণকেল মানটির জন্য রেফারেন্স সমতা চান । উদাহরণ: সি # তে
    DBNull.Value

27
আমি +1 নিয়ে যাব, যদিও আইএমএইচও সিঙ্গেলনগুলি বিশ্বব্যাপী রাষ্ট্রগুলি প্রবর্তনের জন্য অপব্যবহার করা হয়। সিঙ্গলটনের উদ্দেশ্য বিশ্বব্যাপী কোনও বিষয় উপলব্ধ করা নয়, তবে এটি প্রয়োগ করা যে কোনও বস্তু কেবল একবার ইনস্ট্যান্ট হয়। গ্লোবাল অবজেক্টস একটি প্রয়োজনীয় মন্দ। সত্যই প্রয়োজন না হলে তাদের এগুলি ব্যবহার না করার চেষ্টা করা উচিত, যেহেতু তারা সাধারণত স্যামসিংটনটন.সেটইনস্ট্যান্স () .কোটি ম্যাথোড () সহ পুরো জায়গা জুড়ে উচ্চ সংযোগের দিকে পরিচালিত করে। :)
back2dos

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

4
"সহজেই আপনার সিঙ্গলটন প্রতিস্থাপন করুন" অংশটি আমার দৃষ্টিকোণের সবচেয়ে গুরুত্বপূর্ণ পয়েন্ট। স্ট্যাটিক ক্লাস বাস্তবায়নের খুব কাছে বিশ্রাম।
তেওমন শিপাহি

4
সিঙ্গেলটনগুলি যোগফল / পণ্যের ধরণের এবং অনুরূপ জন্য নন-নুল সেন্ডিনেল মান useful উদাহরণস্বরূপ, কোনও বিকল্পের ক্ষেত্রে কোনওটি নয় / কিছুই নয় বা সংগ্রহের ধরণের খালি মান value আপনি কোনও বোনাস হিসাবে দ্রুত খালি / খালি পরীক্ষা পান, কারণ রেফারেন্স সাম্যতা যা প্রয়োজন তা কেবল।
ব্রুস

@itsbruce: আপনার উদাহরণ নয় singletons : খালি তালিকা ক্লাসের একমাত্র সম্ভাব্য উদাহরণস্বরূপ নয়, এবং কোনটি মান অপশন ক্লাসের একমাত্র সম্ভাব্য উদাহরণস্বরূপ নয়। যাইহোক, উদাহরণস্বরূপ যেখানে প্রহরী মান হয় হয় singletons, এবং আমি আমার উত্তর এক যোগ করার জন্য স্বাধীনতা গ্রহণ করেছি। ইনপুট জন্য ধন্যবাদ!
হেইনজি

37

আমি স্ট্যাটিক পদ্ধতিগুলির ক্লাসের পরিবর্তে স্টেটলেস সিঙ্গলটন ব্যবহারের ক্ষেত্রে কেস দেখতে পেতাম, যথা নির্ভরতা ইনজেকশন এর জন্য

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

এটি একটি সিঙ্গলটন উদাহরণ তৈরি করা সহজভাবে নিশ্চিত করে যে আপনি প্রয়োজনের চেয়ে ধরণের আর কোনও অবজেক্ট বরাদ্দ করছেন না (যেহেতু আপনার কেবল কখনও প্রয়োজন)।


4
"এটি কে বা কোথায় ব্যবহার করতে পারে তার উপর আপনার কোনও নিয়ন্ত্রণ নেই" " কারও দরকার পড়বে কেন?
হাগরওয়াল

4
পরীক্ষার উদ্দেশ্যে @ হাগরওয়াল, আপনি এটি উপহাস করতে সক্ষম হবেন
জেমশিত ইস্কেন্দরভ

15

প্রকৃতপক্ষে আমি এখানে অন্য উত্তরটির উল্লেখ না করে খুঁজে পেয়েছি: স্থির পদ্ধতিগুলি পরীক্ষা করা আরও কঠিন।

দেখে মনে হচ্ছে বেশিরভাগ পরীক্ষার ফ্রেমওয়ার্কগুলি মশকরা উদাহরণ পদ্ধতিগুলির জন্য দুর্দান্ত কাজ করে তবে তাদের অনেকগুলি স্থির পদ্ধতিগুলির উপহাসকে শালীন উপায়ে পরিচালনা করে না।


4
তবে পাওয়ারমক এটি করতে সক্ষম হবে বলে মনে হচ্ছে
সেবাস্তিয়ান লরবার

6

বেশিরভাগ প্রোগ্রামিং ভাষার ক্লাসে প্রচুর টাইপ সিস্টেম থাকে system স্থিতিশীল পদ্ধতি এবং ভেরিয়েবলগুলি সহ একটি শ্রেণি যদিও একটি বস্তু হয় তবে এটি প্রায়শই কোনও ইন্টারফেস বাস্তবায়ন করতে পারে না বা অন্যান্য শ্রেণি প্রসারিত করতে পারে না। যে কারণে এটি বহুকর্মী পদ্ধতিতে ব্যবহার করা যায় না, কারণ এটি অন্য ধরণের সাব টাইপ হতে পারে না। উদাহরণস্বরূপ, আপনার যদি একটি ইন্টারফেস থাকে IFooable, যা অন্যান্য শ্রেণীর একাধিক পদ্ধতি স্বাক্ষর দ্বারা প্রয়োজনীয়, বর্গ অবজেক্টের StaticFooজায়গায় ব্যবহার করা যাবে না IFooable, যেখানে FooSingleton.getInstance()(অনুমান, FooSingletonপ্রয়োগ IFooable)।

দয়া করে নোট করুন, যেহেতু আমি হেইনজির উত্তরে মন্তব্য করেছি, তেমনি একটি সিঙ্গলটন তাত্পর্য নিয়ন্ত্রণের একটি নিদর্শন। এটি এর সাথে প্রতিস্থাপন new Class()করে Class.getInstance(), যা লেখককে Classদৃষ্টান্তগুলির উপরে আরও নিয়ন্ত্রণের সুযোগ দেয় , যা তিনি অযৌক্তিক দৃষ্টান্তগুলির সৃষ্টি রোধ করতে ব্যবহার করতে পারেন। সিঙ্গেলটন কারখানার প্যাটার্নের খুব বিশেষ একটি ক্ষেত্র এবং এটির মতোই আচরণ করা উচিত। সাধারণ ব্যবহার এটিকে বৈশ্বিক রেজিস্ট্রিগুলির বিশেষ ক্ষেত্রে পরিণত করে, যা প্রায়শই খারাপ হয়ে যায়, কারণ বৈশ্বিক নিবন্ধগুলি কেবল উইলি-নিলি ব্যবহার করা উচিত নয়।

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

greetz
back2dos


4

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

একটি উদাহরণ বিবেচনা করুন: জাভা.লং.রুনটাইম জাভাতে একটি সিঙ্গলটন ক্লাস। এই শ্রেণিটি প্রতিটি জেভিএমের জন্য বিভিন্ন বাস্তবায়নের অনুমতি দেয়। JVM প্রতি বাস্তবায়ন একক। এই শ্রেণিটি যদি স্থির হত তবে আমরা জেভিএম এর ভিত্তিতে বিভিন্ন বাস্তবায়ন পাস করতে পারি না।

আমি এই লিঙ্কটি সত্যই সহায়ক বলে খুঁজে পেয়েছি: http://javarevisited.blogspot.com/2013/03/differences-between-singleton-pattern-vs-static-class-java.html ?

আশা করি এটা সাহায্য করবে!!


এই উত্তরটি বাস্তব বিশ্বে একটি দৃ .় উদাহরণ অন্তর্ভুক্ত করার জন্য ভাল।
systemovich

2

আমার জন্য "অবজেক্ট স্টেট সিঙ্গলটন ব্যবহার করতে চান, ফাংশনটি স্ট্যাটিক পদ্ধতি ব্যবহার করতে চান"

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

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

পিএস এই 2 এর মধ্যে পারফরম্যান্স মিলিসেকেন্ডে আলাদা, তাই প্রথমে আর্কিটেকচারে ফোকাস করুন ।


1

সিঙ্গলটন রাষ্ট্রহীন নয়, এটি বিশ্বব্যাপী রাষ্ট্র ধারণ করে।

আমি সিঙ্গলটন ব্যবহারের কথা ভাবতে পারি এমন কয়েকটি কারণ হ'ল:

  • স্মৃতি ফুটো এড়াতে
  • একটি অ্যাপ্লিকেশন যেমন সকল ডাটাবেস সংযোগে সমস্ত মডিউলগুলির জন্য একই অবস্থা সরবরাহ করা

আমি জানি তবে বাস্তবে একটি সিঙ্গলটন আরও কম বেশি রাষ্ট্রবিহীন হতে পারে ... যদি এটি কোনও শ্রেণির বৈশিষ্ট্য ভাগ না করে ...
সেবাস্তিয়ান লরবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.