c++ - programming - ল্যাঙ্গুয়েজ




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

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

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

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

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

তাই প্রধান প্রশ্নের উত্তর দিতে হবে:

  • আপনি যখন একটি সিঙ্গলটন ব্যবহার করা উচিত
  • আপনি কিভাবে সঠিকভাবে একটি সিঙ্গলন বাস্তবায়ন করবেন

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

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

একক ব্যবহার করার জন্য ভাল অবস্থা (অনেক নয়):

  • লগ কাঠামো
  • থ্রেড পুনর্ব্যবহারযোগ্য পুল
/*
 * 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;
        }
};

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


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

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

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


Singletons আপনি এক বর্গ দুটি খারাপ বৈশিষ্ট্য একত্রিত করার ক্ষমতা দেয়। যে প্রায় অনেক উপায় ভুল।

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

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

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

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

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

আপনি লিখতে উদ্দেশ্যে যখন

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

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

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

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

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

যদি আপনি কোনও বস্তুর বিশ্বব্যাপী অ্যাক্সেসের প্রয়োজন বোধ করেন তবে std::cout বিশ্বব্যাপী করুন, যেমন std::cout । কিন্তু তৈরি করা যেতে পারে যে ঘটনা সংখ্যা সীমাবদ্ধ করবেন না।

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

যদি আপনার উভয় বৈশিষ্ট্য দরকার হয়, তবে 1) এটি একটি সিঙ্গল্ট তৈরি করুন, এবং 2) আমাকে এটি সম্পর্কে আপনার জানা দরকার, কারণ আমার এমন একটি কেস কল্পনা করা কঠিন সময়।


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

Singletons কিছু দরকারী দিক:

  1. অলস বা আপফ্রন্ট তাত্ক্ষণিক
  2. সেটআপ এবং / অথবা রাষ্ট্র প্রয়োজন একটি বস্তুর জন্য সহজ

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

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


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

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


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

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 এ এই প্যাটার্ন খুঁজে পেতে পারেন।


আমি একটি সাক্ষাত্কার পরীক্ষা হিসাবে Singletons ব্যবহার।

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


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

অত্যধিক এককন্টনের ব্যবহার নিয়ে একটি বড় সমস্যা হল প্যাটার্নটি সহজ এক্সটেনশান এবং বিকল্প বাস্তবায়নগুলির সোয়াপিং প্রতিরোধ করে। সিঙ্গলটন ব্যবহার করা হয় যেখানে ক্লাস নাম হার্ড কোডেড হয়।


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


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


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

#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;
}

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


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


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

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


আমি এখনও একক গ্লোবাল হতে হবে না কেন না।

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

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


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

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

        return *instance_;
    }

private:
    Singleton() {};

    static Singleton *instance_;
};

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

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


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

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





singleton