c# - সফটওয - সি++ প্রোগ্রামিং




C#একটি সিঙ্গলটন কি? (10)

খুব সোজা এগিয়ে প্রশ্ন।

একটি সিঙ্গলটন কি এবং আমি কখন এটি ব্যবহার করা উচিত?


A Singleton (এবং এটি C # এর সাথে সংযুক্ত নয়, এটি একটি ওও ডিজাইন প্যাটার্ন) যখন আপনি আপনার অ্যাপ্লিকেশন জুড়ে একটি ক্লাসের একমাত্র উদাহরণ তৈরি করতে চান। ব্যবহারগুলি সাধারণত বিশ্বব্যাপী সংস্থানগুলি অন্তর্ভুক্ত করবে, যদিও আমি ব্যক্তিগত অভিজ্ঞতা থেকে বলব, তারা প্রায়শই বড় ব্যথার উৎস।


C # এ সিঙ্গল্টন বাস্তবায়নের আরেকটি উপায়, আমি ব্যক্তিগতভাবে এইভাবে পছন্দ করি কারণ আপনি একটি পদ্ধতির পরিবর্তে সিংয়ের ক্লাসের উদাহরণটি অ্যাক্সেস করতে পারেন।

public class Singleton
    {
        private static Singleton instance;

        private Singleton() { }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();
                return instance;
            }
        }

        //instance methods
    }

কিন্তু ভাল, যতদূর আমি জানি উভয় উপায়ে 'অধিকার' বলে মনে হয় তাই এটি কেবল ব্যক্তিগত স্বাদের একটি বিষয়।


Singleton ক্লাসটি সমগ্র অ্যাপ্লিকেশন ডোমেনের জন্য একটি একক উদাহরণ তৈরি করতে ব্যবহৃত হয়।

public class Singleton
{
    private static Singleton singletonInstance = CreateSingleton();

    private Singleton()
    {
    }

    private static Singleton CreateSingleton()
    {
        if (singletonInstance == null)
        {
            singletonInstance = new Singleton();
        }

        return singletonInstance;
    }

    public static Singleton Instance
    {
        get { return singletonInstance; }            
    }
}

এই প্রবন্ধে এটি কীভাবে আমরা পাঠ্যক্রমের পরিবর্তনশীল এবং অ্যাপ্লিকেশনগুলিতে তাদের ব্যবহারিক ব্যবহার ব্যবহার করে থ্রেড নিরাপদ একক্টোন ক্লাস তৈরি করতে পারি তা বর্ণনা করা হয়েছে


আপনি সি # জন্য জিজ্ঞাসা। তুচ্ছ উদাহরণ:


public class Singleton
{
    private Singleton()
    {
        // Prevent outside instantiation
    }

    private static readonly Singleton _singleton = new Singleton();

    public static Singleton GetSingleton()
    {
        return _singleton;
    }
}

আমি সন্ধানের তথ্য জন্য এটি ব্যবহার। ডিবি থেকে একবার লোড করুন।

public sealed class APILookup
    {
        private static readonly APILookup _instance = new APILookup();
        private Dictionary<string, int> _lookup;

        private APILookup()
        {
            try
            {
                _lookup = Utility.GetLookup();
            }
            catch { }
        }

        static APILookup()
        {            
        }

        public static APILookup Instance
        {
            get
            {
                return _instance;
            }
        }
        public Dictionary<string, int> GetLookup()
        {
            return _lookup;
        }

    }

একটি সিঙ্গল্টন একটি শ্রেণী যা কেবলমাত্র নিজের তৈরি করা একটি উদাহরণকে অনুমতি দেয় - এবং বলে দেওয়া উদাহরণটিকে সহজ, সহজ অ্যাক্সেস দেয়। সিঙ্গলটন প্রাঙ্গন সফ্টওয়্যার উন্নয়ন জুড়ে একটি প্যাটার্ন।

সি # # বাস্তবায়ন " সি # এ সিঙ্গলটন প্যাটার্ন বাস্তবায়ন করা " যা আপনাকে জানাতে হবে তার বেশিরভাগ ক্ষেত্রে - থ্রেড নিরাপত্তা সম্পর্কিত কিছু ভাল পরামর্শ সহ।

সৎ হতে, এটি খুব বিরল যে আপনাকে একটি সিঙ্গল্ট বাস্তবায়ন করতে হবে - আমার মতে এটি এমন জিনিসগুলির মধ্যে একটি হওয়া উচিত যা আপনাকে সচেতন হওয়া উচিত, এমনকি এটি খুব বেশি ব্যবহৃত হয় না।


এটি একটি নকশা প্যাটার্ন এবং এটি c # এর জন্য নির্দিষ্ট নয়। এই সম্পর্কে আরো ইন্টারনেট এবং এসও, এই উইকিপিডিয়া নিবন্ধ মত।

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

আপনি যদি এমন একটি বর্গ চান যাটি শুধুমাত্র একবার একবার উত্সাহিত করা যায় তবে এটি ব্যবহার করা উচিত।


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


এটি কি: একটি ক্লাস যা শুধুমাত্র এক, একটি অ্যাপ্লিকেশনের সারাজীবন জুড়ে চলমান উদাহরণ। সিঙ্গলটন প্যাটার্ন দেখুন।

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


using System;
using System.Collections.Generic;
class MainApp
{
    static void Main()
    {
        LoadBalancer oldbalancer = null;
        for (int i = 0; i < 15; i++)
        {
            LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer();

            if (oldbalancer == balancerNew && oldbalancer != null)
            {
                Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server);
            }
            oldbalancer = balancerNew;
        }
        Console.ReadKey();
    }
}

class LoadBalancer
{
    private static LoadBalancer _instance;
    private List<string> _servers = new List<string>();
    private Random _random = new Random();

    private static object syncLock = new object();

    private LoadBalancer()
    {
        _servers.Add("ServerI");
        _servers.Add("ServerII");
        _servers.Add("ServerIII");
        _servers.Add("ServerIV");
        _servers.Add("ServerV");
    }

    public static LoadBalancer GetLoadBalancer()
    {
        if (_instance == null)
        {
            lock (syncLock)
            {
                if (_instance == null)
                {
                    _instance = new LoadBalancer();
                }
            }
        }

        return _instance;
    }

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

আমি dofactory.com থেকে dofactory.com , এতোই অভিনবতা ছিল না তবে আমি এটিকে Foo এবং Bar এর সাথে তুলনায় অনেক ভালো dofactory.com , এছাড়াও সি # 3.0 ডিজাইন প্যাটার্নগুলিতে জুডিথ বিশপের বইটি ম্যাক ডকটিতে সক্রিয় অ্যাপ্লিকেশন সম্পর্কে উদাহরণ রয়েছে।

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

উপরন্তু এখানে ডবল চেক লকিং আছে

if (_instance == null)
            {
                lock (syncLock)
                {
                    if (_instance == null)

যেহেতু এমএসডিএন থেকে

লক শব্দটি নিশ্চিত করে যে একটি থ্রেড কোডের একটি জটিল অংশে প্রবেশ করে না এবং অন্য থ্রেডটি সমালোচনামূলক বিভাগে থাকে। যদি অন্য থ্রেড একটি লক কোড প্রবেশ করার চেষ্টা করে, এটি অবতরণ করা পর্যন্ত অবরুদ্ধ, অবরোধ করবে।

তাই প্রতিটি সময় পারস্পরিক বর্জন লক জারি করা হয়, এমনকি যদি এটি অপ্রয়োজনীয় না হয় তবেও আমাদের নল চেক আছে।

আশা করি এটি আরো ক্লিয়ার করতে সাহায্য করবে।

এবং আমি আমার বোঝার ভুল উপায় নির্দেশ করা হয় তাহলে মন্তব্য করুন।







singleton