সিঙ্গলটন: এটি কীভাবে ব্যবহার করা উচিত


291

সম্পাদনা: অন্য প্রশ্ন থেকে আমি একটি উত্তর সরবরাহ করেছি যার সিঙ্গেলন সম্পর্কে প্রচুর প্রশ্ন / উত্তরগুলির লিঙ্ক রয়েছে: সিলেটলেট সম্পর্কিত আরও তথ্য এখানে:

তাই আমি থ্রেডটি সিঙ্গলেটন পড়েছি : ভাল ডিজাইন বা ক্রাচ?
এবং তর্ক এখনও rages।

আমি সিঙ্গলেটগুলি একটি ডিজাইনের প্যাটার্ন হিসাবে দেখছি (ভাল এবং খারাপ)।

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

সুতরাং যে প্রধান প্রশ্নের উত্তর দেওয়া দরকার তা হ'ল:

  • আপনি কখন একক ব্যবহার করবেন?
  • আপনি কীভাবে একটি সিঙ্গলটনকে সঠিকভাবে প্রয়োগ করবেন

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


তাই বলটি ঘূর্ণায়মান হয়ে
উঠুন : আমি আমার হাতটি ধরে রাখব এবং বলব এটিই আমি ব্যবহার করি তবে সম্ভবত সমস্যা আছে।
তাঁর "" কার্যকর সি ++ "বইগুলিতে বিষয়টির পরিচালনা" স্কট মাইয়ার্স "পছন্দ করি

সিঙ্গলেটন ব্যবহার করার জন্য ভাল পরিস্থিতি (অনেকগুলি নয়):

  • লগিং ফ্রেমওয়ার্কগুলি
  • থ্রেড রিসাইক্লিং পুলগুলি
/*
 * C++ Singleton
 * Limitation: Single Threaded Design
 * See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
 *      For problems associated with locking in multi threaded applications
 *
 * Limitation:
 * If you use this Singleton (A) within a destructor of another Singleton (B)
 * This Singleton (A) must be fully constructed before the constructor of (B)
 * is called.
 */
class MySingleton
{
    private:
        // Private Constructor
        MySingleton();
        // Stop the compiler generating methods of copy the object
        MySingleton(MySingleton const& copy);            // Not Implemented
        MySingleton& operator=(MySingleton const& copy); // Not Implemented

    public:
        static MySingleton& getInstance()
        {
            // The only instance
            // Guaranteed to be lazy initialized
            // Guaranteed that it will be destroyed correctly
            static MySingleton instance;
            return instance;
        }
};

ঠিক আছে. একসাথে কিছু সমালোচনা এবং অন্যান্য বাস্তবায়ন পেতে দিন।
:-)


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

3
কে বলেছে যে একটি কাঠামোর মধ্যে কেবলমাত্র 1 লগার উদাহরণ থাকতে পারে। ফ্রেমওয়ার্কের প্রতিনিধিত্বকারী একটি সিনজেলটন। ফ্রেমওয়ার্ক আপনাকে নির্দিষ্ট লগার দিতে পারে।
মার্টিন ইয়র্ক

হ্যাঁ। আমি থ্রেডপুল হিসাবে সিনজেলটং ব্যবহার করব না। উত্তরগুলি স্পার্ক করার জন্য কেবল ধারণা ছড়িয়ে দেওয়া।
মার্টিন ইয়র্ক

@ ড্যান সিঙ্গলটন যা কৌশল প্যাটার্ন প্রয়োগ করে। আচরণটি সিঙ্গেলটন থেকে বিমূর্ত করা হয়। সিঙ্গলটন প্রবেশের একক পয়েন্ট। দুটি লগার নেই, একটি লগারের সাথে থাকতে হবে যা লগ করার সিদ্ধান্ত নিতে পারে। আপনি একবারে কেবল একটি লগে আউটপুট করতে পারবেন না, দুটি করার দরকার নেই।
লি লুভিয়ের

5
জায়েড: আপনি যদি দুটি ফাইলে লগইন করতে চান? নাকি কোনও ডাটাবেসে? বা একটি নেটওয়ার্ক সকেট? বা জিইউআই উইজেট? পয়েন্টটি হ'ল কৃত্রিম সীমাবদ্ধতাগুলি যুক্ত করবেন না - এর দরকার নেই। আপনি কখনও কখনও দুর্ঘটনাক্রমে কেবল একটিটির পরিবর্তে দুটি লুপের জন্য তৈরি করেছেন? আপনি যদি কেবল একটি লগার চান তবে কেবল একটি তৈরি করুন।

উত্তর:


181

আপনারা সকলেই ভুল। প্রশ্ন পড়া. উত্তর:

একটি সিঙ্গলটন ব্যবহার করুন যদি:

  • আপনার সিস্টেমে এক ধরণের এক এবং একমাত্র অবজেক্ট থাকা দরকার

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

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

সেরা সিঙ্গলটন কীভাবে তৈরি করবেন:

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

14
আসলে, আমি মনে করি আপনিও বেশ সঠিক নন। আমি ভিন্নরূপে বা অন্য কথায় চাই: "আপনি কি এমন প্রয়োজন এক এবং সিস্টেমের মধ্যে একটি টাইপ শুধুমাত্র একটি বস্তু আছে এবং আপনার প্রয়োজন এটি বিশ্বব্যাপী প্রবেশাধিকার আছে" প্রয়োজনের উপর জোর দেওয়া খনি - এটা না করলে তার সুবিধাজনক, শুধুমাত্র যদি আপনি এটা থাকা আবশ্যক।

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

4
পরিবর্তনের জন্য বন্ধ, এক্সটেনশনের জন্য উন্মুক্ত। সমস্যাটি হ'ল আপনি একটি সিঙ্গলটনকে ডুওটন বা ট্রিপলটন হতে প্রসারিত করতে পারবেন না। এটি একক হিসাবে আটকে আছে।
লি লুভিয়ের

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

4
"যদি আপনার সিস্টেমে কোনও ধরণের একটি এবং একমাত্র অবজেক্ট থাকা দরকার" ... "এবং ইউনিট পরীক্ষায় কখনই সেই জিনিসটিকে উপহাস করতে চান না" "
সাইগন

72

সিঙ্গলেটগুলি আপনাকে একটি শ্রেণিতে দুটি খারাপ বৈশিষ্ট্য একত্রিত করার ক্ষমতা দেয়। এটি বেশিরভাগ ক্ষেত্রেই ভুল।

একটি সিঙ্গলটন আপনাকে দেয়:

  1. কোনও বস্তুর গ্লোবাল অ্যাক্সেস এবং
  2. একটি গ্যারান্টি যে এই ধরণের একাধিক বস্তু আর তৈরি করা যাবে না

এক নম্বর সোজা। গ্লোবালগুলি সাধারণত খারাপ হয়। আমাদের সত্যিকারের প্রয়োজন না হলে আমাদের কখনই বিশ্বব্যাপী অ্যাক্সেসযোগ্য হওয়া উচিত নয়।

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

std::ostream os;
os << "hello world\n";

আপনি যখন লেখার ইচ্ছা করেছিলেন

std::cout << "hello world\n";

অবশ্যই না. আমাদের এই ত্রুটির বিরুদ্ধে সুরক্ষা প্রয়োজন নেই, কারণ এই ধরণের ত্রুটি কেবল ঘটে না। যদি এটি হয় তবে সঠিক প্রতিক্রিয়াটি হল ঘরে গিয়ে 12-20 ঘন্টা ঘুমানো এবং আশা করি আপনি ভাল বোধ করছেন।

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

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

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

আপনার যদি কোনও সামগ্রীতে গ্লোবাল অ্যাক্সেসের প্রয়োজন হয় তবে এটিকে একটি বিশ্বব্যাপী করুন std::cout। তবে যে পরিমাণ উদাহরণ তৈরি হতে পারে তাতে সীমাবদ্ধ রাখবেন না।

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

আপনার যদি উভয় বৈশিষ্ট্যের প্রয়োজন হয়, তবে 1) এটিকে একটি সিঙ্গলটন করুন এবং ২) আপনার কী প্রয়োজন তা আমাকে জানান, কারণ এই জাতীয় কেসটি কল্পনা করতে আমার খুব কষ্ট হচ্ছে।


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

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

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

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

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

36

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

1) সিলেটলেটগুলি কোনও সামগ্রীতে একটি বিশ্বব্যাপী অ্যাক্সেস মেকানিজম সরবরাহ করে। যদিও তারা কোনও সংজ্ঞায়িত আরম্ভের আদেশ ছাড়াই ভাষাগুলিতে প্রান্তিকভাবে আরও থ্রেডসেফ বা প্রান্তিকরূপে আরও নির্ভরযোগ্য হতে পারে তবে এই ব্যবহারটি এখনও বৈশ্বিক পরিবর্তনশীলের নৈতিক সমতুল্য। এটি একটি বিশ্বব্যাপী পরিবর্তনশীল যা জি_ফুর পরিবর্তে কিছু বিশ্রী সিনট্যাক্স (foo :: get_instance () এর সাথে পরিহিত, তবে এটি হুবহু একই উদ্দেশ্যটি (পুরো প্রোগ্রাম জুড়ে অ্যাক্সেসযোগ্য একটি একক বস্তু) সরবরাহ করে এবং ঠিক একই ত্রুটি রয়েছে।

2) সিঙ্গেলনগুলি একটি শ্রেণীর একাধিক তাত্পর্য প্রতিরোধ করে। এটি বিরল, আইএমই, এই জাতীয় বৈশিষ্ট্যটি কোনও শ্রেণিতে বেক করা উচিত। এটি সাধারণত অনেক বেশি প্রাসঙ্গিক জিনিস; একমাত্র এবং একমাত্র হিসাবে বিবেচিত অনেকগুলি বিষয় কেবলমাত্র একমাত্র হয়ে ওঠে। আইএমও এর আরও উপযুক্ত সমাধান হ'ল কেবলমাত্র একটি উদাহরণ তৈরি করা - যতক্ষণ না আপনি উপলব্ধি করেন যে আপনার একাধিক উদাহরণ প্রয়োজন।


6
একমত। দুটি ভুল অন্য কারও মতে বাস্তব বিশ্বে সঠিকভাবে তৈরি করতে পারে। তবে প্রোগ্রামিংয়ে দুটি খারাপ ধারণার মিশ্রণ ভাল ফল দেয় না।
jalf

27

নিদর্শন সহ একটি জিনিস: সাধারণীকরণ করবেন না । এগুলি সব ক্ষেত্রে কার্যকর হয় যখন তারা কার্যকর হয় এবং কখন তারা ব্যর্থ হয়।

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

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

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


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

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

1
সিঙ্গলেটগুলি পরীক্ষায় কত ব্যথা করছে তা নির্দেশ করার জন্য +1।
দেবসোলার

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

2
@ উইলিয়াম: এবং আমাকে সময়ে সময়ে একাধিক লগার থাকতে হয়েছিল। আপনি একটি সিঙ্গলটনের পক্ষে যুক্তি দিচ্ছেন না, বরং একটি সরল পুরানো স্থানীয় জন্য। আপনি জানতে চান যে একটি লগার সর্বদা উপলব্ধ। এটি একটি গ্লোবাল জন্য কি। আপনার জানা দরকার নেই যে অন্য কোনও লগার সম্ভবত তড়িঘড়ি করা যায় না , এটি সিঙ্গলটনই প্রয়োগ করে। (আপনার এটির জন্য ইউনিট পরীক্ষা লেখার চেষ্টা - যে অনেক সহজ যদি তৈরি এবং হিসাবে প্রয়োজন তা ধ্বংস করতে পারেন, এবং যে একটি Singleton সম্ভব নয়)
jalf

13

সিলেটলেটগুলি মূলত আপনাকে ভাষাগুলিতে জটিল বিশ্বব্যাপী রাষ্ট্র দেয় যা অন্যথায় জটিল বৈশ্বিক ভেরিয়েবলগুলি রাখা কঠিন বা অসম্ভব করে তোলে।

জাভা বিশেষত গ্লোবাল ভেরিয়েবলের প্রতিস্থাপন হিসাবে সিঙ্গলেটগুলি ব্যবহার করে, কারণ সমস্ত কিছু অবশ্যই একটি শ্রেণীর মধ্যে থাকা আবশ্যক। এটি বিশ্বব্যাপী ভেরিয়েবলগুলির নিকটে সবচেয়ে নিকটে আসে হ'ল পাবলিক স্ট্যাটিক ভেরিয়েবল, যা ব্যবহার করা যেতে পারে যেমন তারা বিশ্বব্যাপী ছিলimport static

সি ++ এর গ্লোবাল ভেরিয়েবল রয়েছে তবে গ্লোবাল ক্লাস ভেরিয়েবলের কনস্ট্রাক্টররা যে ক্রমে অনুরোধ করা হয়েছে তা অনির্ধারিত। যেমন, একটি সিঙ্গলটন আপনাকে প্রথমবারের মতো ভেরিয়েবলের প্রয়োজন না হওয়া পর্যন্ত গ্লোবাল ভেরিয়েবলের সৃষ্টি স্থগিত করতে দেয়।

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

তাহলে সিঙ্গলটন ব্যবহার করা কখন ভাল / খারাপ? বেশ কিছুটা ঠিক যখন বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করা ভাল / খারাপ হয়।


কখন বৈশ্বিক পরিবর্তনশীল "ভাল" হয়? কখনও কখনও এগুলি কোনও সমস্যার জন্য সর্বোত্তম কাজ, তবে তারা কখনই "ভাল" হয় না।
দেবসোলার

1
বিশ্বব্যাপী পরিবর্তনশীল ভাল যখন এটি সর্বত্র ব্যবহৃত হয় এবং সমস্ত কিছুতে এটির অ্যাক্সেস থাকতে পারে। একটি একক রাষ্ট্রের টুরিং মেশিনের প্রয়োগ একটি সিঙ্গলটন ব্যবহার করতে পারে।
লি লুভিয়ের 15

আমি এই উত্তরে ইন্ডিয়ারেশনের স্তরটি পছন্দ করি: "যখন কোনও বিশ্বব্যাপী ব্যবহার করা ভাল / খারাপ হবে"। দেবসোলার এবং লি লুভিয়ের দু'জনেই তারা যে মূল্য দিয়ে সম্মত হন তা পেয়ে যায় যদিও উত্তর সময়ে এটি মন্তব্য করতে পারে তা জানা যায়নি।
প্রেক্সিওলটিক

6

আলেকজান্দ্রেস্কু দ্বারা নির্মিত আধুনিক সি ++ ডিজাইনের একটি থ্রেড-নিরাপদ, উত্তরাধিকারসূত্রে জেনেরিক সিঙ্গলটন রয়েছে।

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


6
  • আপনি কীভাবে একটি সিঙ্গলটনকে সঠিকভাবে প্রয়োগ করবেন

এখানে এমন একটি সমস্যা আছে যা আমি কখনই উল্লেখ করে দেখিনি, আমি এমন কিছু কাজ করেছি যা আগের কাজটিতে এসেছিল। আমাদের সি ++ সিলেটলেট ছিল যা ডিএলএল-এর মধ্যে ভাগ করা হয়েছিল এবং ক্লাসের একক উদাহরণ কেবল কাজ করে না তা নিশ্চিত করার স্বাভাবিক মেকানিক্স। সমস্যাটি হ'ল প্রতিটি ডিএলএল এক্সই এর সাথে স্ট্যাটিক ভেরিয়েবলগুলির নিজস্ব সেট পায়। যদি আপনার get_instance ফাংশনটি ইনলাইন বা স্ট্যাটিক লাইব্রেরির অংশ হয়, তবে প্রতিটি ডিএলএল "সিঙ্গলটন" এর নিজস্ব অনুলিপিটি সরিয়ে ফেলবে।

সমাধানটি সিঙ্গেলটন কোডটি কেবলমাত্র একটি ডিএলএল বা এএসইইতে সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করা বা উদাহরণগুলি পার্সেল করার জন্য এই বৈশিষ্ট্যগুলি সহ একটি সিঙ্গলটন ম্যানেজার তৈরি করা উচিত।


10
হ্যাঁ, আমি শুনেছি যে আপনি সিঙ্গলটোন পছন্দ করেছেন, তাই আমি আপনার সিঙ্গেলনের জন্য একটি সিঙ্গেলটন তৈরি করেছি, যাতে আপনি অ্যান্টি-প্যাটার্নকে অ্যান্টি-প্যাটার্ন করতে পারেন।
ইভা

@ ইভা, হ্যাঁ এরকম কিছু। আমি সমস্যাটি তৈরি করিনি, আমাকে কেবল এটি কোনওভাবে কাজ করতে হবে।
মার্ক রান্সম

5

প্রথম উদাহরণটি থ্রেডটি নিরাপদ নয় - যদি দুটি থ্রেড একই সাথে getInstance কল করে, তবে স্ট্যাটিকটি পিআইটিএ হতে চলেছে। কিছু ফর্ম মুটেক্স সাহায্য করবে।


হ্যাঁ যা উপরের মন্তব্যে উল্লিখিত হয়েছে: * সীমাবদ্ধতা: একক থ্রেডেড ডিজাইন * দেখুন: aristeia.com / পেপারস / ডিডিজে_জুল_আগ_2004_revised.pdf * মাল্টি থ্রেড অ্যাপ্লিকেশনগুলিতে লকিং সম্পর্কিত সমস্যার জন্য
মার্টিন ইয়র্ক

স্থিতিশীল পদ্ধতি এবং অন্যান্য ক্রিয়াকলাপগুলির জন্য উদাহরণ পদ্ধতি হিসাবে কেবল getInstance সহ ক্লাসিক সিঙ্গলটন কখনই থ্রেডকে নিরাপদ করা যায় না। (ভাল না হলে আপনি থ্রেড লোকাল স্টোরেজ ব্যবহার করে এক-প্রতি-থ্রেড-টনে তৈরি করেন ...)
টবি

এমনকি সি ++ 11 বা তার পরেও?
hg_git

5

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

সিঙ্গেলনের কয়েকটি কার্যকর দিক:

  1. অলস বা সামনে ইনস্ট্যান্টেশন
  2. কোনও অবজেক্টের জন্য সুবিধাজনক যার জন্য সেটআপ এবং / অথবা রাজ্যের প্রয়োজন

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

অবশেষে, একটি কারখানা স্প্রিং ইত্যাদির মতো নির্ভরতা ইনজেকশন প্রযুক্তিতে নিজেকে ঘৃণা করে


3

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

আপনি যদি প্রতিবার এটি করেন, পারফরম্যান্সটি হ্রাস পাবে। এটি একটি সিঙ্গলটনে ব্যবহার করে, আপনি একবার সেই হিটটি নিয়ে যান এবং তারপরে সমস্ত পরবর্তী কলগুলি করার দরকার নেই।


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

3

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

সুতরাং এমনকি লগার বা থ্রেড পুলগুলির উদাহরণগুলিও অবৈধ এবং কৌশলগুলি দ্বারা প্রতিস্থাপন করা উচিত।


লগাররা নিজেরাই সিলেটলেট না হওয়া উচিত। সাধারণ "সম্প্রচার" বার্তা ব্যবস্থা হওয়া উচিত system লগাররা নিজেরাই সম্প্রচারিত বার্তাগুলির গ্রাহক।
ক্যাশকো

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

3

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


3

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



2

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

#include<iostream>
#include<mutex>

using namespace std;
std::mutex mtx;

class MySingleton{
private:
    static MySingleton * singletonInstance;
    MySingleton();
    ~MySingleton();
public:
    static MySingleton* GetInstance();
    MySingleton(const MySingleton&) = delete;
    const MySingleton& operator=(const MySingleton&) = delete;
    MySingleton(MySingleton&& other) noexcept = delete;
    MySingleton& operator=(MySingleton&& other) noexcept = delete;
};

MySingleton* MySingleton::singletonInstance = nullptr;
MySingleton::MySingleton(){ };
MySingleton::~MySingleton(){
    delete singletonInstance;
};

MySingleton* MySingleton::GetInstance(){
    if (singletonInstance == NULL){
        std::lock_guard<std::mutex> lock(mtx);
        if (singletonInstance == NULL)
            singletonInstance = new MySingleton();
    }
    return singletonInstance;
}

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


2
এটি অবশ্যই ভাল নয়। 1: আপনি পয়েন্টার ব্যবহার করে মালিকানা শব্দার্থবিজ্ঞানের সংজ্ঞা দিচ্ছেন না। আপনি সি ++ তে পয়েন্টার ব্যবহার করবেন না যদি না আপনি সেগুলি পরিচালনা করার জন্য প্রস্তুত না হন। 2: আপনার ডাবল চেকড লকিংয়ের ব্যবহার পুরানো এবং এটি করার আরও অনেক ভাল আধুনিক উপায় রয়েছে। 3: ধ্বংস সম্পর্কে আপনার মন্তব্য নিষ্পাপ। মেমরির পুনঃসংশোধন এটি ক্লিনআপ সম্পর্কে ডেস্ট্রাক্টর ব্যবহারের বিন্দু নয়। আরও ভাল সংস্করণের জন্য পরামর্শ: প্রশ্নটি দেখুন। সেখানে উপস্থাপিত সংস্করণটি ইতিমধ্যে আরও ভাল।
মার্টিন ইয়র্ক

1

আমি একটি সাক্ষাত্কার পরীক্ষা হিসাবে সিঙ্গলেটন ব্যবহার করি।

আমি যখন কোনও বিকাশকারীকে কিছু নকশার নিদর্শনগুলির নাম বলতে বলি, তার নামকরণ করা যায় এমন সবগুলি যদি সিঙ্গলটন হয় তবে সেগুলি ভাড়া দেওয়া হয় না।


45
নিয়োগের বিষয়ে কঠোর এবং দ্রুত নিয়ম আপনাকে সম্ভাব্য কর্মীদের বিস্তৃত বৈচিত্র্য থেকে বাদ দিতে বাধ্য করবে।
কার্ল

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

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

4
ডাউন ভোট। আমার ব্যক্তিগত অভিজ্ঞতা থেকে - প্রোগ্রামার সিঙ্গেলটন ছাড়া অন্য কোনও ধরণের নাম নাও পেতে পারে তবে এর অর্থ এই নয় যে সে সিঙ্গলেটগুলি ব্যবহার করে। ব্যক্তিগতভাবে, আমি আমার কোডে সিলেটলেটগুলি ব্যবহার করছিলাম তার আগে আমি কখনই তাদের সম্পর্কে শুনেছি (আমি তাদের "স্মার্ট গ্লোবাল" বলেছিলাম - আমি জানতাম যে গ্লোবাল কী)। আমি যখন তাদের সম্পর্কে জানতে পেরেছিলাম, যখন আমি তাদের উপকারিতা এবং কনস সম্পর্কে জানতে পারি - তখন আমি সেগুলি ব্যবহার বন্ধ করে দিয়েছি। হঠাৎ করে, আমি যখন থামলাম ইউনিট পরীক্ষা করা আমার কাছে আরও আকর্ষণীয় হয়ে উঠল ... এটি কি আমাকে আরও খারাপ প্রোগ্রামার করে তুলেছে? Pfff ...
Paulius

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

0

এন্টি-ব্যবহার:

মাত্রাতিরিক্ত সিঙ্গলটন ব্যবহারের সাথে একটি বড় সমস্যা হ'ল প্যাটার্নটি সহজ বর্ধিতকরণ এবং বিকল্প বাস্তবায়নের অদলবদলকে বাধা দেয়। ক্লাস-নামটি যেখানেই সিঙ্গলটন ব্যবহৃত হয়েছে সেখানে হার্ড কোডিং is


২ টি কারণে ডাউনভোটেড: ১. সিঙ্গেলটন অভ্যন্তরীণভাবে পলিমারফিক ঘটনাগুলি ব্যবহার করতে পারে (উদাহরণস্বরূপ, গ্লোবাল লগার লক্ষ্যবস্তু করার বহুবিধ কৌশলগুলি ব্যবহার করে) ২. সিঙ্গলটন নামের জন্য টাইপডেফ থাকতে পারে, সুতরাং কোডটি টাইপডেফের উপর নির্ভর করে।
শীর্ষস্থানীয় গেমদেব

আমি কৌতূহলীভাবে পুনরাবৃত্তি টেম্পলেট প্যাটার্নটি ব্যবহার করে প্রসারিত হওয়ার জন্য আমার একক সংস্করণটি তৈরি করে শেষ করেছি।
জাচারি ক্রাউস

0

আমি মনে করি এটি সি # এর জন্য সবচেয়ে শক্তিশালী সংস্করণ :

using System;
using System.Collections;
using System.Threading;

namespace DoFactory.GangOfFour.Singleton.RealWorld
{

  // MainApp test application

  class MainApp
  {
    static void Main()
    {
      LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b4 = LoadBalancer.GetLoadBalancer();

      // Same instance?
      if (b1 == b2 && b2 == b3 && b3 == b4)
      {
        Console.WriteLine("Same instance\n");
      }

      // All are the same instance -- use b1 arbitrarily
      // Load balance 15 server requests
      for (int i = 0; i < 15; i++)
      {
        Console.WriteLine(b1.Server);
      }

      // Wait for user
      Console.Read();    
    }
  }

  // "Singleton"

  class LoadBalancer
  {
    private static LoadBalancer instance;
    private ArrayList servers = new ArrayList();

    private Random random = new Random();

    // Lock synchronization object
    private static object syncLock = new object();

    // Constructor (protected)
    protected LoadBalancer()
    {
      // List of available servers
      servers.Add("ServerI");
      servers.Add("ServerII");
      servers.Add("ServerIII");
      servers.Add("ServerIV");
      servers.Add("ServerV");
    }

    public static LoadBalancer GetLoadBalancer()
    {
      // Support multithreaded applications through
      // 'Double checked locking' pattern which (once
      // the instance exists) avoids locking each
      // time the method is invoked
      if (instance == null)
      {
        lock (syncLock)
        {
          if (instance == null)
          {
            instance = new LoadBalancer();
          }
        }
      }

      return instance;
    }

    // Simple, but effective random load balancer

    public string Server
    {
      get
      {
        int r = random.Next(servers.Count);
        return servers[r].ToString();
      }
    }
  }
}

এখানে .NET- অনুকূলিতকরণ সংস্করণ :

using System;
using System.Collections;

namespace DoFactory.GangOfFour.Singleton.NETOptimized
{

  // MainApp test application

  class MainApp
  {

    static void Main()
    {
      LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
      LoadBalancer b4 = LoadBalancer.GetLoadBalancer();

      // Confirm these are the same instance
      if (b1 == b2 && b2 == b3 && b3 == b4)
      {
        Console.WriteLine("Same instance\n");
      }

      // All are the same instance -- use b1 arbitrarily
      // Load balance 15 requests for a server
      for (int i = 0; i < 15; i++)
      {
        Console.WriteLine(b1.Server);
      }

      // Wait for user
      Console.Read();    
    }
  }

  // Singleton

  sealed class LoadBalancer
  {
    // Static members are lazily initialized.
    // .NET guarantees thread safety for static initialization
    private static readonly LoadBalancer instance =
      new LoadBalancer();

    private ArrayList servers = new ArrayList();
    private Random random = new Random();

    // Note: constructor is private.
    private LoadBalancer()
    {
      // List of available servers
      servers.Add("ServerI");
      servers.Add("ServerII");
      servers.Add("ServerIII");
      servers.Add("ServerIV");
      servers.Add("ServerV");
    }

    public static LoadBalancer GetLoadBalancer()
    {
      return instance;
    }

    // Simple, but effective load balancer
    public string Server
    {
      get
      {
        int r = random.Next(servers.Count);
        return servers[r].ToString();
      }
    }
  }
}

আপনি এই প্যাটার্ন জানতে পারেন dotfactory.com


3
কোডটি পড়া সহজ করার জন্য আপনি যে অংশগুলি বিশেষত সিঙ্গলটনের সাথে সম্পর্কিত নয় সেগুলি বের করে ফেলতে পারেন।
মার্টিন ইয়র্ক

এছাড়াও, আপনার প্রথম সংস্করণটি থ্রেড-নিরাপদ নয় সম্ভাব্য পঠন / লেখার পুনঃক্রমের কারণে। দেখুন stackoverflow.com/questions/9666/...
টমাস Danecker

5
আহ ... ভুল ভাষা? প্রশ্নটি বেশ স্পষ্টতই সি ++ তে ট্যাগ ।
দেবসোলার

0

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

একটি সিঙ্গলটন হ'ল বিশ্বব্যাপী অ্যাক্সেসযোগ্য অবজেক্টের (এখন থেকে জিএও) বাস্তবায়ন যদিও সমস্ত জিএও একক নয়।

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

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

এই বিষয়টি মনে রেখে, জিওএগুলি এভাবে শুরু করা যেতে পারে:

namespace {

T1 * pt1 = NULL;
T2 * pt2 = NULL;
T3 * pt3 = NULL;
T4 * pt4 = NULL;

}

int main( int argc, char* argv[])
{
   T1 t1(args1);
   T2 t2(args2);
   T3 t3(args3);
   T4 t4(args4);

   pt1 = &t1;
   pt2 = &t2;
   pt3 = &t3;
   pt4 = &t4;

   dostuff();

}

T1& getT1()
{
   return *pt1;
}

T2& getT2()
{
   return *pt2;
}

T3& getT3()
{
  return *pt3;
}

T4& getT4()
{
  return *pt4;
}

এটি তার মতো নিষ্ঠুরভাবে করার দরকার নেই এবং স্পষ্টভাবে বোঝা লাইব্রেরিতে এমন বস্তু রয়েছে যা আপনি সম্ভবত তাদের জীবদ্দশায় পরিচালনা করার জন্য অন্য কোনও প্রক্রিয়া চান। (আপনি লাইব্রেরিটি লোড করার সময় আপনি যে কোনও জিনিস পেতে পারেন সেগুলিতে রাখুন)।

আমি যখন সিলেটলেট ব্যবহার করি? আমি তাদের 2 টি জিনিসের জন্য ব্যবহার করেছি - একটি সিঙ্গলটন টেবিল যা নির্দেশ করে যে কোন লাইব্রেরিগুলি ড্লোপেন দিয়ে লোড করা হয়েছে - এমন বার্তা হ্যান্ডলার যা লোগাররা সাবস্ক্রাইব করতে পারে এবং আপনি এতে বার্তা প্রেরণ করতে পারেন। বিশেষত সিগন্যাল হ্যান্ডলারের জন্য প্রয়োজনীয়।


0

একটি সিঙ্গলটন কেন বিশ্বব্যাপী হতে হবে তা আমি এখনও পাই না।

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

এই কার্যকারিতা কেন খারাপ হবে তা আমি দেখছি না।


আপনি কেন ভাবেন এটি বিশ্বব্যাপী হতে হবে তা আমি বুঝতে পারি না।
মার্টিন ইয়র্ক

এই থ্রেড অনুসারে, সবাই বলছিলেন যে একটি সিঙ্গলটন বিশ্বব্যাপী হতে হবে
জ্যাকারি ক্রাউস

1
না। থ্রেড ইঙ্গিত দেয় যে একটি সিনগেল্টনের বৈশ্বিক অবস্থা রয়েছে। এটি বৈশ্বিক পরিবর্তনশীল নয় Not আপনার প্রস্তাবিত সমাধানটির বৈশ্বিক অবস্থা রয়েছে। আপনার প্রস্তাবিত সমাধানটি একটি বৈশ্বিক পরিবর্তনশীলও ব্যবহার করছে; শ্রেণীর স্থিতিশীল সদস্য হ'ল "স্ট্যাটিক স্টোরেজ সময়কাল" এর একটি অবজেক্ট একটি বৈশ্বিক পরিবর্তনশীল "স্ট্যাটিক স্টোরেজ সময়কাল" এর অবজেক্ট। সুতরাং দুটি মূলত কিছুটা আলাদা শব্দার্থক / স্কোপস সহ একই জিনিস।
মার্টিন ইয়র্ক

সুতরাং একটি প্রাইভেট স্ট্যাটিক ভেরিয়েবল "স্ট্যাটিক স্টোরেজ সময়কাল" এর কারণে এখনও বিশ্বব্যাপী?
জাচারি ক্রাউস

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

0

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

আমি নিশ্চিত যে এখানে অন্যান্য সমাধান রয়েছে তবে আমি এটিকে খুব কার্যকর এবং কার্যকর করা সহজ বলে মনে করি।


0

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

সিঙ্গেলটনগুলি বস্তু হিসাবে তাদের ব্যবহার করুন, অনেক লোক সরাসরি পদ্ধতিটি কল করার মাধ্যমে সরাসরি এটি সিলেটলে পৌঁছে দেয় যা এটি ফেরত দেয় তবে এটি ক্ষতিকারক কারণ আপনি নিজের কোডটি জানেন যে অবজেক্টটি সিঙ্গলটন, আমি বস্তু হিসাবে সিঙ্গেলন ব্যবহার করতে পছন্দ করি, আমি তাদের পাস করি কনস্ট্রাক্টরের মাধ্যমে এবং আমি এগুলিকে সাধারণ বস্তু হিসাবে ব্যবহার করি, এইভাবে, আপনার কোডটি জানেন না যে এই বিষয়গুলি একক বা না এবং এটি নির্ভরতা আরও সুস্পষ্ট করে তোলে এবং এটি রিফ্যাক্টরিংয়ের জন্য কিছুটা সহায়তা করে ...


-1

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

সম্পাদনা করুন - অবশ্যই এগুলি কেবল পঠনযোগ্য হওয়া উচিত!


তবে এই প্রশ্নটি ভিক্ষা করছে; ব্যবহারকারীর ভাষা এবং সহায়তা ফাইলের পথ কেন একেবারে উদাহরণস্বরূপ হওয়া উচিত ?
ড্রিপজ্জা

2
আমরা তার জন্য গ্লোবাল আছে। তাদের
সিলেটলেট করার

গ্লোবাল ভেরিয়েবল - তারপরে আপনি কীভাবে এগুলি রেজিস্ট্রি / ডেটাবেস থেকে সিরিয়াল করবেন? গোবাল শ্রেণি - তাহলে আপনি কীভাবে নিশ্চিত করবেন যে তাদের মধ্যে কেবল একটি আছে?
মার্টিন বেকেট

@ এমজিবি: আপনি তাদের রেজিস্ট্রি / ডাটাবেস থেকে মানগুলি পড়তে এবং বিশ্বব্যাপী ভেরিয়েবলগুলিতে সংরক্ষণ করে সিরিয়ালিয়াল করেছেন (এটি সম্ভবত আপনার মূল ফাংশনের শীর্ষে করা উচিত)। আপনি নিশ্চিত করেছেন যে শ্রেণীর কেবলমাত্র একটি অবজেক্ট রয়েছে, কেবলমাত্র শ্রেণীর একটি অবজেক্ট তৈরি করে ... সত্যই ... গ্রেপ-আরএন "নতুন global + গ্লোবাল_ক্লাস_নাম" "এমন কঠিন। ' ? সত্যি?
পলিয়াস

7
@ এমজিবি: পৃথিবীতে কেন আমি নিশ্চিত করব যে সেখানে কেবল একটি আছে? আমার কেবল এটি জানতে হবে যে একটি উদাহরণ সর্বদা বর্তমান সেটিংসের প্রতিনিধিত্ব করে । তবে জায়গাটির চারপাশে আমাকে অন্য সেটিংসের জিনিস রাখার অনুমতি না দেওয়ার কোনও কারণ নেই। উদাহরণস্বরূপ, "ব্যবহারকারী বর্তমানে সেটিংসের জন্য সংজ্ঞা দিচ্ছেন, তবে এখনও প্রয়োগ করেননি" one বা "কনফিগারেশনের জন্য ব্যবহারকারীর আগে সংরক্ষণ করা হয়েছিল যাতে সে পরে তাদের কাছে ফিরে আসতে পারে"। বা আপনার প্রতিটি ইউনিট পরীক্ষার জন্য একটি।
জলফ

-1

আরেকটি বাস্তবায়ন

class Singleton
{
public:
    static Singleton& Instance()
    {
        // lazy initialize
        if (instance_ == NULL) instance_ = new Singleton();

        return *instance_;
    }

private:
    Singleton() {};

    static Singleton *instance_;
};

3
এটা সত্যিই ভয়াবহ। আরও ভাল অলস সূচনা এবং আরও গুরুত্বপূর্ণভাবে গ্যারান্টিযুক্ত নির্বাহী ধ্বংসের জন্য দেখুন: স্ট্যাকওভারফ্লো / সাকশনস / 1008019/ c- singleton-design- Pattern/…
মার্টিন ইয়র্ক

আপনি যদি পয়েন্টার ব্যবহার করতে চলেছেন তবে Instance()কোনও পয়েন্টারটি ফেরত দেওয়া উচিত, কোনও রেফারেন্স নয়। আপনার ভিতরে .cppফাইল, নাল করার উদাহরণ হিসেবে বলা যায় আরম্ভ: Singleton* Singleton::instance_ = nullptr;। আর Instance()হিসাবে প্রয়োগ করা হবে: if (instance_ == nullptr) instance_ = new Singleton(); return instance_;
ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.