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


1765

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

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


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

5
ইতিমধ্যে অনেক উত্তর আছে। এটি আসলে এমন একটি singletonবস্তু যেখানে staticপদ্ধতিগুলি কেবল ফাংশন, একটি অ-ওও সত্তা।
ফাস্টকোডজাভা

4
বাস্তবায়নের উপর নির্ভর করে .. csharpindepth.com
আর্টিকেলস

4
আপনি যখন তৃতীয় পক্ষগুলিকে শ্রেণীর প্রয়োগের সরবরাহ করার অনুমতি দিতে চান তখন একটি পার্থক্য রয়েছে। এই ক্ষেত্রে আপনার সাধারণত কারখানার নিদর্শনগুলিরও প্রয়োজন। Agiletribe.wordpress.com/2013/10/08/…
AgilePro

আইএমও এই উত্তরটি খুব ভালভাবে স্ট্যাকওভারফ্লো
ডেভ

উত্তর:


1249

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

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


29
ঠিক আছে, আপনি যদি এটি পছন্দ করেন তবে উভয়ই অন্তর্নিহিতভাবে থ্রেডসেফ নয়, আপনাকে এগুলি উভয়ই থ্রেডসেফ করে তুলতে হবে, সুতরাং সেখানে কোনও পার্থক্য নেই।
জর্জি কর্ডোবা

119
আপনি কিছু যা একটি উদাহরণ দিতে পারি হল মজ্জাগতভাবে threadsafe, অপরিবর্তনীয় ধরনের ছাড়া অন্য?
জন স্কিটি

26
স্কেটের কাছে: লোকে বলে যে সিঙ্গলটন থ্রেডসফ নয়, এর অর্থ হ'ল একটি সিঙ্গলটন অকারণে সর্বদা থ্রেডগুলির মধ্যে ভাগ করা হয় , যখন স্ট্যাক অবজেক্টগুলি যখন আপনার প্রয়োজন হয় তখন তা ভাগ করা হয়, যার অর্থ আপনাকে অবিযুক্ত সিঙ্ক্রোনাইজেশন করতে হবে না।

45
@ গীক: কল্পনা করুন যে সিঙ্গলটন একটি ইন্টারফেস প্রয়োগ করে Fooএবং আপনার Fooপ্যারামিটার হিসাবে গ্রহণ করার পদ্ধতি রয়েছে । এই সেটআপের সাথে, কলাররা বাস্তবায়ন হিসাবে সিঙ্গেলটন ব্যবহার করতে বেছে নিতে পারে - বা তারা কোনও আলাদা বাস্তবায়ন ব্যবহার করতে পারে। পদ্ধতিটি সিঙ্গলটন থেকে decoupled হয়। শ্রেণীর যেখানে স্থির পদ্ধতি রয়েছে তার সাথে তুলনা করুন - কোডগুলির প্রতিটি টুকরা যা এই পদ্ধতিগুলিকে কল করতে চায় সেগুলি ক্লাসের সাথে দৃly়ভাবে মিলিত হয়েছে, কারণ কোন শ্রেণিতে স্থির পদ্ধতি রয়েছে তা নির্দিষ্ট করতে হবে।
জন স্কিটি

10
@ আমিরবারেকেট: যদিও এটি সিঙ্গলটন ডিজাইনের ধরণ অনুসারে সিঙ্গলটন নয় - যদি শ্রেণি নিজেই একাধিক উদাহরণ তৈরি করতে দেয় তবে কারখানাটি যা করুক না কেন এটি একক আইএমও নয়।
জন স্কিটি

475

আসল উত্তরটি এখানে অন্য ফোরামে জন স্কিট দ্বারা ।

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

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


64
আপনি কেন স্থিরভাবে getInstance () পদ্ধতিতে কল করে প্রায় যে কোনও জায়গা থেকে একই উদাহরণটি অ্যাক্সেস করতে পারলে আপনি কেন প্যারামিটার হিসাবে একটি সিঙ্গলটনকে পাস করবেন?
হেনরিক অর্ডাইন

23
@ হেনরিকঅর্ডাইন তাই এটি বিদ্যমান কোডের সাথে ফিট করে এবং একটি ইন্টারফেস সরবরাহ করতে পারে?

6
নিবন্ধ স্থির শ্রেণি তাত্ক্ষণিকভাবে চালু করা যায় না। তবুও, আপনি যদি স্ট্যাটিক পদ্ধতিযুক্ত কোনও (অ-স্থিতিশীল) শ্রেণীর কোনও উদাহরণ পাস করেন তবে আপনি কোনও উদাহরণে স্থির পদ্ধতিগুলি কল করতে পারবেন না।
গোরান

3
স্ট্যাটিক ক্লাস কি? অন্তত জাভাতে, এ জাতীয় কোনও জিনিস নেই।
হেনরিক অর্ডাইন

16
@ গোরান আমি প্রথমে আপনার কথা শুনে খুব বিভ্রান্ত হয়ে পড়েছিলাম। আপনি বলেছিলেন "আপনি উদাহরণ হিসাবে স্থির পদ্ধতিতে কল করতে পারবেন না"। আমি পড়লাম যে "যদি আপনার কাছে কোনও ইনস্ট্যান্টিয়েটেড অবজেক্টের রেফারেন্স থাকে তবে আপনি এটি থাকতে পারে এমন কোনও স্থির পদ্ধতিতে কল করতে পারবেন না।" এটি অবশ্যই ভুল। আবার কয়েকবার পড়ার পরে আমি মনে করি আপনি "স্ট্যাটিক পদ্ধতিগুলির অভ্যন্তরে ক্লাসে অ স্থিতিকাল অ্যাক্সেসগুলি অ্যাক্সেস করতে পারবেন না" বোঝাতে চেয়েছিলেন যা সঠিক। এই উত্তরটি আসা এবং আপনার মন্তব্যগুলি পড়েন যারা এই ধারণাগুলিতে নতুন যে কেউ এই স্পষ্ট করতে চান।
অ্যান্ড্রু স্টিৎস

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

99
দ্বিতীয় বিবৃতি ভুল। আমরা সিঙ্গলটন অবজেক্টটি ক্লোন করতে পারি না। একক বাস্তবায়ন অবশ্যই এটি প্রত্যাখ্যান করতে হবে। আপনি যদি সত্যই সিঙ্গলটন ক্লোন করতে পারেন তবে এটি সিঙ্গেলটন নয়।
আলেকজান্ডার ইয়ানচারুক

19
এটি উত্তর জাভা জন্য সঠিক নয়: একক না স্ট্যাটিক স্ট্যাক ব্যবহার করে না।
AgilePro

72
# 1 গুরুত্বপূর্ণ নয়। # 2 একটি ত্রুটিযুক্ত বাস্তবায়ন বর্ণনা করে। # 3 সম্পূর্ণরূপে বিচার্য নয়।
কেসি

31
স্ট্যাটিক অবজেক্টটি স্ট্যাকে কীভাবে সংরক্ষণ করা যায়? আপনি যখন কোনও পদ্ধতিতে ডাকেন তখন নতুন স্ট্যাক ফ্রেম তৈরি হয়, এটি পদ্ধতির স্থানীয় ভেরিয়েবলগুলি সঞ্চয় করে, পদ্ধতিটি ফিরে আসার পরে এই স্ট্যাক ফ্রেমটি সরানো হয় এবং সেই স্থানীয় ভেরিয়েবলগুলি হারিয়ে যায়। অবশ্যই স্ট্যাক দ্রুত, তবে এটি স্ট্যাটিক অবজেক্টগুলি সঞ্চয় করার পক্ষে উপযুক্ত নয়।
মাইক_ম

23
আমি এটির উপরোক্ত সংখ্যাগুলি বুঝতে পারি না। 1) কেন সিঙ্গলটন স্ট্যাকের মধ্যে রাখা উচিত? স্থানীয় পদ্ধতি ভেরিয়েবল / প্যারামিটার বাদে সি # বা জাভা সম্পর্কিত মতো পরিচালিত ভাষাগুলিতে ম্যানেজড হ্যাপে ডেটা সংরক্ষণ করা হয়। 2) আপনি যদি এটি ক্লোন করতে পারেন তবে এটি সঠিকভাবে প্রয়োগ করা সিঙ্গলটন নয়। 3) সিঙ্গেলটন একটি ওওপি অ্যান্টি-প্যাটার্ন হিসাবে পরিচিত; অর্থাৎ এমন কিছু যা সম্ভব হলে এড়ানো উচিত। 4) এটি একমাত্র জিনিস যা সঠিক।
গ্রো

152

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


10
ভাল, ব্যবহারিক পয়েন্টের জন্য +1। সিঙ্গেলন প্যাটার্নটি সাধারণভাবে অতিরিক্ত ব্যবহার করা হয় তবে কয়েকটি পরিস্থিতি এটি উপযুক্ত is আরও দেখুন: agiletribe.wordpress.com/2013/10/08/…
AgilePro

3
আপনি বহুবর্ষজীবী হওয়ার সুবিধা সম্পর্কে ঠিক বলেছেন। এটি সবচেয়ে গুরুত্বপূর্ণ পয়েন্ট
আহমাদ

নেস্টেড স্ট্যাটিক ক্লাস ইন্টারফেস প্রয়োগ করতে পারে। এটি কোডিং চেষ্টা করুন, কাজ করবে। আমি কোনও ত্রুটি ছাড়াই কোডটি সংকলন করতে পারি।
ন্যানোসফ্ট

75

staticক্লাসগুলি এমন কোনও কিছুর জন্য নয় যা রাষ্ট্রের প্রয়োজন। এটি একত্রে ফাংশনগুলি Math( যেমন বা Utilsপ্রকল্পগুলিতে) রাখার জন্য দরকারী । সুতরাং শ্রেণীর নামটি কেবল আমাদের একটি ক্লু দেয় যেখানে আমরা ফাংশনগুলি এবং আরও কিছু খুঁজে পেতে পারি।

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

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

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


16
স্ট্যাটিক ক্লাসগুলিকে রাষ্ট্র বাঁচানোর জন্য প্রয়োজনীয় কিছু করা উচিত নয় কেন?
21-24 এ পরীক্ষিত

12
@ ট্রাইপড: আপনার আরম্ভ বা চূড়ান্তকরণের উপর নির্ভুল নিয়ন্ত্রণ নেই।
Xaqron

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

1
রাষ্ট্র বজায় রাখার অর্থ কী? রাষ্ট্র কী?
কাইল

2
@ কাইলডিলেনি: সহজভাবে Stateহ'ল একটি বস্তুর বিভিন্ন বৈশিষ্ট্যের সংমিশ্রণ যা সাধারণত সময়ের সাথে সাথে পরিবর্তিত হয়। আপনি আনুষ্ঠানিক সংজ্ঞা জন্য গুগল করতে পারেন।
Xaqron

65

স্ট্যাটিক ক্লাস: -

  1. আপনি স্থির শ্রেণীর উদাহরণ তৈরি করতে পারবেন না।

  2. ক্লাসযুক্ত প্রোগ্রাম বা নেমস্পেসটি লোড হওয়ার সময় .NET ফ্রেমওয়ার্ক সাধারণ ভাষা রানটাইম (সিএলআর) দ্বারা স্বয়ংক্রিয়ভাবে লোড হয়।

  3. স্ট্যাটিক ক্লাসে কনস্ট্রাক্টর থাকতে পারে না।

  4. আমরা স্ট্যাটিক ক্লাসটি পদ্ধতিতে পাস করতে পারি না।

  5. আমরা সি # তে স্ট্যাটিক ক্লাসের অন্য স্ট্যাটিক শ্রেণিতে উত্তরাধিকারী হতে পারি না।

  6. সমস্ত স্ট্যাটিক পদ্ধতিযুক্ত একটি বর্গ।

  7. আরও ভাল পারফরম্যান্স (স্থির পদ্ধতিগুলি সংকলনের সময় জড়িত)

একক: -

  1. আপনি অবজেক্টের একটি উদাহরণ তৈরি করতে পারেন এবং এটি পুনরায় ব্যবহার করতে পারেন।

  2. সিঙ্গেলটন উদাহরণটি প্রথমবার তৈরি করা হয়েছে যখন ব্যবহারকারী অনুরোধ করেছিলেন।

  3. সিঙ্গলটন ক্লাসে কনস্ট্রাক্টর থাকতে পারে।

  4. আপনি সিঙ্গলটন শ্রেণীর অবজেক্টটি তৈরি করতে এবং এটি পদ্ধতিতে পাস করতে পারেন।

  5. সিঙ্গলটন শ্রেণি উত্তরাধিকারের কোনও বিধিনিষেধ বলছে না।

  6. আমরা একটি সিঙ্গলটন শ্রেণীর অবজেক্টগুলিকে নিষ্পত্তি করতে পারি তবে স্থির শ্রেণীর নয়।

  7. পদ্ধতিগুলি ওভাররাইড করা যায়।

  8. প্রয়োজনে অলস বোঝা হতে পারে (স্ট্যাটিক ক্লাস সবসময় লোড থাকে)।

  9. আমরা ইন্টারফেস প্রয়োগ করতে পারি (স্ট্যাটিক ক্লাস ইন্টারফেস প্রয়োগ করতে পারে না)।


13
স্ট্যাটিক ক্লাস কনস্ট্রাকটর আছে: msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
Tomer Arazy

2
হ্যাঁ, স্ট্যাটিকের এমন কনস্ট্রাক্টর থাকতে পারে যা ওই শ্রেণীর অভ্যন্তরীণ। ক্লাসে কোনও স্থিতিশীল পদ্ধতি ডাকলে এটি ডাকে।
rahulmr

সংকলনের সময় সিঙ্গেলনের জন্য, এটি হিপ মেমরিতে সংরক্ষণ করা হয় তবে এটি একবার ইনস্ট্যান্ট হয়ে গেলে এটি স্ট্যাকের মধ্যে সংরক্ষণ করা হয়?
আলোকিত_দেব

@ আলোকিত_দেব নং। যে কোনও সিঙ্গলটন উদাহরণটি দিনের শেষে একটি অবজেক্ট উদাহরণস্বরূপ। এটি সন্দেহের ভিত্তিতে স্তূপে জমা হবে।
আরবিটি

1
@rahulmr গুরুত্বপূর্ণ পার্থক্য: প্রথম (একা কেবল) উদাহরণটি তৈরির আগে কনস্ট্রাক্টরও আহ্বান জানায়।
কুলপ্প্পো

53

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

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


1

32
আপনি মনে করেন. আমি অন্যভাবে চিন্তা। ;) উদাহরণস্বরূপ, একটি একক কারখানা কল্পনা করুন যা কোনও ইন্টারফেস দেয় returns আপনি জানেন যে আপনি একটি আইসিংলেটন পাচ্ছেন (এবং এটি চিরদিনের মতো একই) তবে কোনটি বাস্তবায়ন করছে তা অগত্যা।
মোরেনডিল

নেস্টেড স্ট্যাটিক ক্লাসে উদাহরণ পদ্ধতিও থাকতে পারে, এটি কেবল স্থির পদ্ধতিতে সীমাবদ্ধ নয় .. এটি কোড করুন এবং আপনি দেখতে পারেন।
ন্যানোসফ্ট

একটি ভাল বস্তু মডেল (যেমন রুবি) সহ ভাষাগুলিতে, ক্লাসগুলিও বস্তু। স্থির শ্রেণীর "খাঁটি প্রক্রিয়াজাতীয়" দিকটি ভাষা দ্বারা চাপানো একটি স্বেচ্ছাসেবী বাধা।
সর্বাধিক

36

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

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

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

39
এটি সত্যই কোনও সিঙ্গেলন প্যাটার্ন নয়, আমার কাছে আরও বেশি কারখানার মতো দেখাচ্ছে।
ভাভা

10
সত্যই নয়, দুজনের মধ্যে মৌলিক পার্থক্যটি হ'ল সিঙ্গেলটন তার একক বস্তুটিকে "ক্যাশে" করবে এবং একইটিকে ফেরত দেওয়া (একটি রেফারেন্স) রাখবে। কারখানার প্যাটার্নটি নতুন উদাহরণ তৈরি করবে।
রহস্যময়

12
তারপরে এটি প্রক্সি-
সিঙ্গলটন

3
হুম, আমি সিঙ্গেলনের বিভিন্ন জাতটি মনোস্টেট হিসাবে জানি।
হুপি

উদাহরণ কারখানার
নিদর্শন

26

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

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

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


আমি মনে করি না আপনি সরাসরি কোনও সিঙ্গলটকে উপহাস করতে পারেন। আপনার কি এমন একটি ইন্টারফেস ঘোষণা করতে হবে না যা সিঙ্গলটন এবং মক ক্লাস উভয়ই প্রয়োগ করে?
এলেন স্পার্টাস

@ এস্পার্টাস আপনি কেন নিজের সিঙ্গলটনের উপহাস করতে পারবেন না? মকিতো ব্যবহারের উদাহরণ MySingleton mockOfMySingleton = mock(MySingleton.class)
মাইক রাইল্যান্ডার

আপনি ঠিক বলেছেন, আপনি প্রতিবিম্ব ব্যবহার করে এমন মকিতোর মতো সরঞ্জাম দিয়ে এটি উপহাস করতে পারেন। আমি বুঝিয়েছি আপনি এটিকে সাবক্লাসিং করে এবং এর পদ্ধতিগুলিকে ওভাররাইড করে সরাসরি এটি উপহাস করতে পারবেন না।
এলেন স্পারটাস

@ এস্পার্টাস কেন নেই? আপনি যখন পরীক্ষা করছেন এমন বস্তুটি তাত্ক্ষণিকভাবে চালু করার সময় আপনি যেখানেই আসলটি ব্যবহার করেছেন সেখানে আপনার সিঙ্গলটনের সাবক্লাস বাস্তবায়ন করতে পারবেন। উদা:new ClazzToTest(mockSingleton);
মাইক Rylander

আমি মকিতো ব্যবহার করি নি, তবে আপনি কীভাবে এমন একটি শ্রেণীর সাবক্লাস করতে পারেন যেখানে একটি প্রাইভেট কনস্ট্রাক্টর রয়েছে, যেটি সিঙ্গলটনের ক্ষেত্রে প্রতিফলন ব্যবহার না করে? সম্পর্কিত আলোচনা: স্ট্যাকওভারফ্লো / সিকিউশনস
class

23

এখানে একটি ভাল নিবন্ধ: http://javarevisited.blogspot.com.au/2013/03/differences-between-singleton-pattern-vs-static-class-java.html

স্ট্যাটিক ক্লাস

একক বস্তু

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


সম্পাদনাগুলি


4
আমি জাভা সম্পর্কে জানি না, তবে। নেট, আপনার শেষ দুটি পয়েন্ট ভুল। স্ট্যাটিক ক্লাস স্ট্যাটিক প্রীতি এবং ক্ষেত্রগুলিকে উল্লেখ করতে পারে, সুতরাং স্থিতিতে তারা সমান। এবং তারা অলস লোড হয় - স্থির কনস্ট্রাক্টর চালিত হয় যখন: 1) শ্রেণীর একটি উদাহরণ তৈরি করা হয়। 2) ক্লাসের স্থির সদস্যদের কোনও রেফারেন্স করা হয়। 1 প্রযোজ্য নয়, যা 2 টি ছেড়ে যায় So সুতরাং, কোনও স্থির শ্রেণি প্রথমবার ব্যবহার না হওয়া পর্যন্ত লোড করা হয় না।
jmoreno

1
স্ট্যাটিক ক্লাসের জন্য, আপনি স্থির পদ্ধতিটি ওভাররাইড করতে না পারলেও, স্থির পদ্ধতিটি তার পিতামাতার কাছ থেকে লুকিয়ে রাখতে পারেন।
ম্যাক্স পেং

যদি Animal animal = new Cat();তারপর animal.foo();কি হবে?
আলোকিত_দেব

@ জোমরনো স্থির শ্রেণি প্রথমবার ব্যবহার না হওয়া পর্যন্ত লোড হয় না? আমি বিশ্বাস করি এটি সংকলনের সময় স্ট্যাক মেমোরিতে সঞ্চয় করা আছে। এবং এটি তাত্ক্ষণিকভাবে অ্যাক্সেস করা হয় .. না?
আলোকিত_দেব

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

22

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


19

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

মোরেনডিলের মন্তব্য, "একটি স্ট্যাটিক শ্রেণিতে অন্তর্নির্মিত নকশার শৈলী নিখুঁতভাবে প্রক্রিয়াজাতীয়" আমি ভুল হতে পারি, তবে আমি একমত নই। স্থিতিশীল পদ্ধতিতে আপনি স্থির সদস্যদের অ্যাক্সেস করতে পারেন, যা সিঙ্গেলটন পদ্ধতিগুলির মতো তাদের একক উদাহরণ সদস্যদের অ্যাক্সেস করতে পারে।

সম্পাদনা:
আমি আসলে এখন ভাবছি যে আরও একটি পার্থক্য হ'ল একটি স্ট্যাটিক শ্রেণি প্রোগ্রামের শুরুতে ইনস্ট্যান্ট করা হয় * এবং পুরো জীবনের পুরো সময় জুড়ে থাকে, যখন একটি সিঙ্গেলন স্পষ্টভাবে কিছুটা সময়ে ইনস্ট্যান্ট হয় এবং এটি ধ্বংসও হতে পারে।

* বা ভাষা ব্যবহারের ভিত্তিতে এটি প্রথম ব্যবহারের সময় ইনস্ট্যান্ট করা যেতে পারে বলে আমি মনে করি।


15
হ্যাঁ, প্রত্যেকে প্রত্যেকে এই সত্যটিকে এড়িয়ে চলেছে যে স্থির পদ্ধতিগুলির সাথে একটি শ্রেণীর ব্যক্তিগত স্ট্যাটিক ক্ষেত্র থাকতে পারে যা এটি এখনও রাষ্ট্র বজায় রাখতে ব্যবহার করতে পারে (এবং এর কয়েকটি ক্লায়েন্ট কোডে পাবলিক স্ট্যাটিক সেটার / গেটারের মাধ্যমে প্রকাশ করা)।
ব্যবহারকারীর 289463

17

জনের পয়েন্টটি উদাহরণস্বরূপ, যা নীচে দেখানো হয়েছে তা করা যাবে না যদি লগার একটি স্ট্যাটিক শ্রেণি ছিল The ক্লাসটি SomeClassআশা করে যে ILoggerবাস্তবায়নের কোনও উদাহরণটি তার নির্মাণকারীর মধ্যে পাস হবে।

নির্ভরতা ইনজেকশন সম্ভব হওয়ার জন্য সিঙ্গলটন ক্লাস গুরুত্বপূর্ণ।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var someClass = new SomeClass(Logger.GetLogger());
        }


    }

    public class SomeClass 
    {
        public SomeClass(ILogger MyLogger)
        {

        }
    }

    public class Logger : ILogger
    {
        private static Logger _logger;
        private Logger() { }

        public static Logger GetLogger()
        {
            if (_logger==null)
            {
                _logger = new Logger();
            }

            return _logger;
        }

        public void Log()
        {

        }

    }


    public interface ILogger
    {
         void Log();
    }
}

13

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

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


11

সিঙ্গলটনের তাত্ক্ষণিক ঘটনা রয়েছে, এটি কেবলমাত্র একবারে ইনস্ট্যান্টিয়েটেড, কেবলমাত্র সিঙ্গলটনে একক

একটি স্থির শ্রেণি নিজেকে ছাড়া অন্য কিছু দ্বারা তাত্ক্ষণিকভাবে করা যায় না।


স্ট্যাটিক ক্লাস জাভাতে খুব ইনস্ট্যান্টেট করা যেতে পারে। Docs.oracle.com/javase/tutorial/java/javaOO/nested.html পড়ুন। এছাড়াও আমার উত্তর পড়ুন stackoverflow.com/a/37114702/1406510
nanosoft

8

প্রধান পার্থক্যগুলি হ'ল:

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

7

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

নীচের উদাহরণে আমি এটি চিত্রিত করব। ধরুন আপনার কাছে একটি পদ্ধতি রয়েছে গুডপ্রাইস () যা একটি পদ্ধতি getPrice () ব্যবহার করে এবং আপনি getPrice () সিঙ্গেলনে একটি পদ্ধতি হিসাবে প্রয়োগ করেন।

সিঙ্গেলটন যা getPrice কার্যকারিতা সরবরাহ করে:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

গেটপ্রেস ব্যবহার:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

চূড়ান্ত একক বাস্তবায়ন:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

পরীক্ষা ক্লাস:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

যদি আমরা getPrice () প্রয়োগের জন্য স্থিতিশীল পদ্ধতি ব্যবহারের বিকল্প গ্রহণ করি তবে এটি মক getPrice () এর পক্ষে কঠিন ছিল। আপনি পাওয়ার মোকের সাহায্যে স্থিতিকে বিদ্রূপ করতে পারেন, তবুও সমস্ত পণ্য এটি ব্যবহার করতে পারে না।


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

সাহায্য করার জন্য ধন্যবাদ. এটি থ্রেড নিরাপদ করা খুব সহজ। তদতিরিক্ত, আমি ক্যাচিংয়ের উদ্দেশ্যে সিঙ্গেলটন ব্যবহার করি।
আমির বারেকেট

1
হ্যাঁ, যদিও অর্থহীন মাথার সাথে। আবার, সিঙ্গলটন ব্যবহার না করাও সহজ।
জন স্কিটি

6

আমি এই সংজ্ঞার সাথে একমত:

" একক " শব্দের অর্থ অ্যাপ্লিকেশন লাইফ চক্র জুড়ে একক অবজেক্ট, সুতরাং সুযোগটি প্রয়োগ স্তরের পর্যায়ে রয়েছে।

স্ট্যাটিক তাই সুযোগ অ্যাপ ডোমেন পর্যায়ে, যেকোনো অবজেক্ট পয়েন্টার নেই।

তাছাড়া উভয়ই থ্রেড-সেফ হওয়ার জন্য প্রয়োগ করা উচিত।

আপনি আকর্ষণীয় অন্যান্য পার্থক্য সম্পর্কে জানতে পারেন: একক প্যাটার্ন ভার্সেস স্ট্যাটিক ক্লাস


5

একটি উল্লেখযোগ্য পার্থক্য হল পৃথক ইনস্ট্যান্টেশন যা সিঙ্গলটনের সাথে আসে।

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


4

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

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

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


4

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

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

সিঙ্গলটন রাষ্ট্রবিহীন পরিস্থিতিতে রাষ্ট্র বজায় রাখার একটি উপায় সরবরাহ করে

আশা করি আপনাকে সাহায্য করবে ..


3
  1. অলস লোড হচ্ছে
  2. ইন্টারফেস সমর্থন, যাতে পৃথক বাস্তবায়ন সরবরাহ করা যেতে পারে
  3. উদ্ভূত প্রকার ফেরানোর ক্ষমতা (অলস লোডিং এবং ইন্টারফেস বাস্তবায়নের সংমিশ্রণ হিসাবে)

নেস্টেড স্ট্যাটিক ক্লাস জাভাতে ইন্টারফেস কার্যকর করতে পারে খুব বেশি। আপনার দ্বিতীয় পয়েন্টটি ভুল।
ন্যানোসফ্ট

3

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

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

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


3

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


3

আমি নিম্নলিখিতটি পড়ি এবং মনে করি এটির অর্থও বোধ হয়:

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

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

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


আমি দ্বিমত পোষণ করব, যেহেতু এটি ক্লাসে কেবলমাত্র একটি দায়িত্ব যুক্ত করেছে, (এটি ধরে নিলে এটি কিছু করে) এর অর্থ এটি এখন একক দায়িত্বের নীতি লঙ্ঘন করে।
স্মিথ

3

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

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

আমি এটি
ইংলিশ

3
  1. আমরা সিঙ্গলটন ক্লাসের অবজেক্টটি তৈরি করতে এবং এটি পদ্ধতিতে পাস করতে পারি।

  2. সিঙ্গলটন ক্লাস উত্তরাধিকারের কোনও বিধিনিষেধ দেয় না।

  3. আমরা একটি স্ট্যাটিক শ্রেণীর অবজেক্টগুলি নিষ্পত্তি করতে পারি না তবে একক ক্লাস করতে পারি।


যদি সর্বদা কেবলমাত্র একটি থাকে এবং একটিতে সর্বদা স্থির রেফারেন্স থাকে তবে কোনও পদ্ধতিতে সিঙ্গেলটনকে কীভাবে ব্যবহার করতে হবে?
অ্যারন ফ্রাঙ্ক

3

স্থির শ্রেণি থেকে পৃথকীকরণ

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

সিঙ্গলটনের সুবিধা

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

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

  • সিঙ্গেলনের সাথে, আপনি বেস ক্লাসটি প্রসারিত করতে, একটি ইন্টারফেস প্রয়োগ করতে এবং বিভিন্ন বাস্তবায়ন সরবরাহ করতে উত্তরাধিকার এবং পলিমারফিজম ব্যবহার করতে পারেন।

  • যেহেতু জাভাতে স্থির পদ্ধতিগুলি ওভাররাইড করা যায় না, সেগুলি নমনীয়তায় বাড়ে। অন্যদিকে, আপনি সিঙ্গলটন শ্রেণিতে বিস্তৃত পদ্ধতিগুলি প্রসারিত করে ওভাররাইড করতে পারেন।

স্থির শ্রেণীর অসুবিধাগুলি

  • স্ট্যাটিক ক্লাসের চেয়ে সিঙ্গলটনের জন্য ইউনিট পরীক্ষা লেখা সহজ, কারণ আপনি যখনই সিঙ্গলটন প্রত্যাশিত হন তখন মক অবজেক্টটি পাস করতে পারেন।

স্থির শ্রেণির সুবিধা of

  • স্ট্যাটিক ক্লাস সিঙ্গলটনের চেয়ে আরও ভাল পারফরম্যান্স সরবরাহ করে, কারণ স্থির পদ্ধতিগুলি সংকলনের সময় বন্ধ থাকে।

সুবিধা এবং অসুবিধাগুলির সাথে একেকটি একক প্যাটার্নের বেশ কয়েকটি উপলব্ধি রয়েছে।

  • আগ্রহী লোডিং সিঙ্গলটন
  • ডাবল-চেকড লকিং সিঙ্গলটন
  • ইনিশিয়েশন-অন-ডিমান্ড হোল্ডার আইডিয়াম
  • এনাম বেসড সিঙ্গলটন

তাদের প্রত্যেকটির বিশদ বিবরণ খুব ভার্জোজ যার ফলে আমি একটি ভাল নিবন্ধের জন্য কেবল একটি লিঙ্ক রেখেছি - আপনি সিঙ্গেলটন সম্পর্কে যা জানতে চান


2

একক স্থিতিশীল শ্রেণীর উদাহরণ (যা কোনও শ্রেণীর একক উদাহরণ, যা একটি স্ট্যাটিক বা বৈশ্বিক পরিবর্তনশীল হিসাবে ঘটে) এবং স্তূপের উপর শ্রেণীর উদাহরণের জন্য একটি একক স্থিতিশীল পয়েন্টারের মধ্যে বিশাল পার্থক্য রয়েছে :

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


1
সুতরাং যদি অ্যাপ্লিকেশন থেকে প্রস্থান হয় সিঙ্গেলটন এখনও স্মৃতিতে থাকবে?
ন্যানোসফ্ট

আমার মনে হয় আপনার বর্তমান থ্রেডটি প্রস্থান করার সময়, অ্যাপ্লিকেশনটি নয়, তাই না? অ্যাপ্লিকেশনটি যদি প্রস্থান করে, অন্য থ্রেড থেকে এটি থেকে কিছু ব্যবহার করার উপায় নেই।
টম ব্রিটো

2

আমার মাথার পার্থক্যটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (সিঙ্গলটন / প্রোটোটাইপ) বা ফাংশনাল প্রোগ্রামিং (স্ট্যাটিক) প্রয়োগ করছে।

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

অন্যদিকে স্থির ব্যবহারিক প্রোগ্রামিং বাস্তবায়নের জন্য ব্যবহৃত হয়। স্থির সদস্যরা একটি শ্রেণীর অন্তর্গত। তারা রাষ্ট্রহীন।

যাইহোক আপনি কী জানেন যে আপনি সিঙ্গলটন স্ট্যাটিক ক্লাস তৈরি করতে পারেন :)


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