সিঙ্গেলটন কী এবং আমি কখন এটি ব্যবহার করব?
X
কথা বলতে পারি Y
? কেবল Y
একটি সিঙ্গলটন বানাতে পারি !) যার ফলে পরীক্ষার / ডিবাগিং এবং প্রোগ্রামিংয়ের পদ্ধতিগত শৈলীতে অসুবিধা হয়। কখনও কখনও সিলেটলেটগুলি প্রয়োজনীয়; বেশিরভাগ সময়, না।
সিঙ্গেলটন কী এবং আমি কখন এটি ব্যবহার করব?
X
কথা বলতে পারি Y
? কেবল Y
একটি সিঙ্গলটন বানাতে পারি !) যার ফলে পরীক্ষার / ডিবাগিং এবং প্রোগ্রামিংয়ের পদ্ধতিগত শৈলীতে অসুবিধা হয়। কখনও কখনও সিলেটলেটগুলি প্রয়োজনীয়; বেশিরভাগ সময়, না।
উত্তর:
একটি সিঙ্গলটন এমন একটি শ্রেণি যা কেবল নিজের একটি উদাহরণ তৈরি করতে দেয় - এবং উদাহরণটিতে সহজ, সহজ অ্যাক্সেস দেয়। সিঙ্গেলন প্রাইমস সফটওয়্যার বিকাশ জুড়ে একটি নিদর্শন।
থ্রেড সুরক্ষা সম্পর্কিত কিছু ভাল পরামর্শ সহ - আপনার সর্বাধিক যা জানতে হবে তার বেশিরভাগ জুড়ে একটি সি # বাস্তবায়ন রয়েছে " সি # তে একক প্যাটার্ন বাস্তবায়ন করা " ।
সত্যি কথা বলতে, এটি খুব বিরল যে আপনার একটি সিঙ্গলটন বাস্তবায়ন করতে হবে - আমার মতে এটি যে বিষয়গুলির সম্পর্কে আপনার সচেতন হওয়া উচিত সেগুলির মধ্যে একটি হওয়া উচিত, এমনকি এটি প্রায়শই ব্যবহার না করা হলেও।
Lazy<T> Class
।
আপনি সি # চেয়েছিলেন। তুচ্ছ উদাহরণ:
public class Singleton
{
private Singleton()
{
// Prevent outside instantiation
}
private static readonly Singleton _singleton = new Singleton();
public static Singleton GetSingleton()
{
return _singleton;
}
}
এটি কী: একটি শ্রেণি যার জন্য একটি আবেদনের আজীবন জুড়ে কেবল একটি, ধ্রুবক উদাহরণ রয়েছে। একক প্যাটার্ন দেখুন ।
যখন আপনি এটি ব্যবহার করা উচিত: যতটা সম্ভব সম্ভব। শুধুমাত্র যখন আপনি একেবারে নিশ্চিত হন যে আপনার এটি প্রয়োজন। আমি "কখনই না" বলতে নারাজ, তবে সাধারণত আরও ভাল বিকল্প থাকে যেমন ডিপেন্ডেন্সি ইনজেকশন বা কেবল স্ট্যাটিক ক্লাস।
সি # তে সিঙ্গেলটন প্রয়োগের আর একটি উপায়, আমি ব্যক্তিগতভাবে এইভাবে পছন্দ করি কারণ আপনি কোনও পদ্ধতির পরিবর্তে সম্পত্তি হিসাবে সিগনগন শ্রেণির উদাহরণটি অ্যাক্সেস করতে পারেন।
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
//instance methods
}
তবে ভাল, যতদূর আমি জানি উভয় উপায়ই 'সঠিক' হিসাবে বিবেচিত তাই এটি কেবল ব্যক্তিগত স্বাদের জিনিস।
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 থেকে কোড নিয়েছি , তেমন অভিনব কোনও কিছুই নেই তবে আমি ফু ও বারের সাথে সি # 3.0 ডিজাইনের প্যাটার্নসে জুডিথ বিশপের কাছ থেকে বইয়ের সাথে ম্যাক ডকে সক্রিয় প্রয়োগ সম্পর্কে উদাহরণ সহকারে উদাহরণের চেয়ে আরও ভাল দেখতে পেয়েছি ।
আপনি যদি কোডটির দিকে লক্ষ্য করেন আমরা আসলে লুপের জন্য নতুন অবজেক্ট তৈরি করছি, যাতে নতুন অবজেক্ট তৈরি হয় তবে উদাহরণস্বরূপ পুনরায় ব্যবহার করা হয় যার ফলস্বরূপ ওল্ড ব্যালেন্সার এবং নতুন ভারসাম্যকারের একই উদাহরণ রয়েছে, কীভাবে? স্ট্যাটিক কীওয়ার্ডের কারণে এটি ফাংশন গেটলয়েডবালেন্সার () এ ব্যবহৃত হয়েছে , বিভিন্ন সার্ভারের মান থাকা যা এলোমেলো তালিকার পরেও , গেটলয়েডবালেন্সারের স্থিতিশীল () কোনও নির্দিষ্ট অবজেক্টের পরিবর্তে টাইপ নিজেই সম্পর্কিত।
অতিরিক্তভাবে এখানে ডাবল চেক লকিং আছে
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
এমএসডিএন থেকে
লক কীওয়ার্ডটি নিশ্চিত করে যে একটি থ্রেড কোডের সমালোচনামূলক বিভাগে প্রবেশ করবে না এবং অন্য থ্রেড সমালোচনামূলক বিভাগে রয়েছে। যদি অন্য থ্রেড কোনও লকড কোড প্রবেশ করানোর চেষ্টা করে তবে অবজেক্টটি প্রকাশ না হওয়া পর্যন্ত এটি অপেক্ষা করবে, অবরুদ্ধ করবে।
সুতরাং প্রতিবারের পারস্পরিক-বাদ দেওয়ার লকটি জারি করা হয়, এমনকি এটির প্রয়োজন না থাকলেও যা অপ্রয়োজনীয় তাই আমাদের নাল চেক করা উচিত।
আশা করি এটি আরও পরিষ্কার করতে সহায়তা করে।
এবং দয়া করে মন্তব্য করুন যদি আমার বোঝাপড়াটি ভুল উপায়ে পরিচালিত করে।
একটি সিঙ্গলটন (এবং এটি সি # এর সাথে আবদ্ধ নয়, এটি একটি ওও ডিজাইনের ধরণ) তখন আপনি যখন আপনার অ্যাপ্লিকেশন জুড়ে কেবলমাত্র একটি ক্লাসের উদাহরণ তৈরি করতে চান। ব্যবহারগুলিতে সাধারণত বৈশ্বিক সংস্থান অন্তর্ভুক্ত থাকে, যদিও আমি ব্যক্তিগত অভিজ্ঞতা থেকে বলব, এগুলি প্রায়শই দুর্দান্ত ব্যথার উত্স।
এটি একটি ডিজাইনের ধরণ এবং এটি সি # তে নির্দিষ্ট নয়। পুরো উইকিপিডিয়া নিবন্ধের মতো পুরো ইন্টারনেট এবং এসও সম্পর্কে এটি সম্পর্কে আরও ।
সফটওয়্যার ইঞ্জিনিয়ারিংয়ে, সিঙ্গলটন প্যাটার্ন হ'ল একটি নকশার প্যাটার্ন যা কোনও শ্রেণীর ইনস্ট্যান্টেশনকে একটি বস্তুর মধ্যে সীমাবদ্ধ করতে ব্যবহৃত হয়। সিস্টেমের ক্রিয়াকলাপের সমন্বয় করার জন্য ঠিক যখন কোনও বস্তুর প্রয়োজন হয় তখন এটি কার্যকর হয়। ধারণাটি কখনও কখনও এমন সিস্টেমে সাধারণীকরণ করা হয় যেগুলি কেবলমাত্র একটি বস্তুর উপস্থিতিতে আরও কার্যকরভাবে পরিচালিত হয় বা এটি নির্দিষ্ট সংখ্যক অবজেক্টগুলিতে ইনস্ট্যান্টেশনকে সীমাবদ্ধ করে (যেমন, পাঁচটি)। কেউ কেউ এটিকে নিদর্শনবিরোধী বলে বিবেচনা করে, এটি অতিরিক্ত ব্যবহার করা হয়েছে এমন সিদ্ধান্ত নিয়ে, এমন পরিস্থিতিতে অপ্রয়োজনীয় সীমাবদ্ধতার পরিচয় দেয় যেখানে শ্রেণীর একমাত্র উদাহরণ প্রয়োজন হয় না, এবং বিশ্বব্যাপী রাষ্ট্রকে একটি প্রয়োগের সাথে পরিচয় করে।
আপনি যদি এমন কোনও ক্লাস চান যা এটি কেবল একবার ইনস্ট্যান্ট করা যায়।
আমি এটি দেখার জন্য ডেটা ব্যবহার করি। ডিবি থেকে একবার লোড করুন।
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;
}
}
সিঙ্গেলটন কী:
এটি এমন একটি শ্রেণি যা কেবল নিজের একটি উদাহরণ তৈরি করতে দেয় এবং সাধারণত সেই দৃষ্টিতে সাধারণ অ্যাক্সেস দেয়।
আপনার কখন ব্যবহার করা উচিত:
এটি পরিস্থিতির উপর নির্ভর করে।
দ্রষ্টব্য: দয়া করে ডিবি সংযোগে ব্যবহার করবেন না, বিস্তারিত উত্তরের জন্য দয়া করে উল্লেখ করুন @Chad গ্রান্ট এর উত্তর
এখানে একটি এর একটি সাধারণ উদাহরণ Singleton
:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
আপনি এটি Lazy<T>
তৈরি করতেও ব্যবহার করতে পারেন Singleton
।
আরও বিশদ উদাহরণ ব্যবহার করে এখানে দেখুনLazy<T>
এখানে সিঙ্গেলটনটি কী: http://en.wikedia.org/wiki/Singleton_ Pattern
আমি সি # জানি না, তবে এটি আসলে সমস্ত ভাষায় একই জিনিস, কেবল বাস্তবায়ন আলাদা।
এটি সম্ভব হলে সাধারণত সিঙ্গলটন এড়ানো উচিত তবে কিছু পরিস্থিতিতে এটি খুব সুবিধাজনক।
আমার ইংরেজীর জন্য দুঃখিত ;)
পুরো অ্যাপ্লিকেশন ডোমেনের জন্য একক উদাহরণ তৈরি করতে সিঙ্গলটন ক্লাস ব্যবহার করা হয়।
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; }
}
}
ইন এই নিবন্ধটি এটা বর্ণনা করা হয়েছে কিভাবে আমরা কেবলমাত্র পরিবর্তনশীল এবং অ্যাপ্লিকেশন তাদের ব্যবহারিক প্রয়োগের ব্যবহার থ্রেড নিরাপদ Singleton বর্গ তৈরি করতে পারেন।
EX আপনি বিশ্বব্যাপী তথ্যের জন্য সিঙ্গেলটন ব্যবহার করতে পারেন যা ইনজেকশনের প্রয়োজন।
আমার ক্ষেত্রে, আমি গ্লোবাল স্ট্যাটিক ক্লাসে লগড ব্যবহারকারীর বিবরণ (ব্যবহারকারীর নাম, অনুমতি ইত্যাদি) রাখছিলাম। এবং যখন আমি ইউনিট পরীক্ষাটি প্রয়োগ করার চেষ্টা করেছি, তখন কন্ট্রোলার ক্লাসগুলিতে নির্ভরতা ইনজেকশন করার কোনও উপায় ছিল না। এইভাবে আমি আমার স্ট্যাটিক ক্লাসটি সিঙ্গলটন প্যাটার্নে পরিবর্তন করেছি।
public class SysManager
{
private static readonly SysManager_instance = new SysManager();
static SysManager() {}
private SysManager(){}
public static SysManager Instance
{
get {return _instance;}
}
}
http://csharpindepth.com/Articles/General/Singleton.aspx#cctor
আমাদের সি # তে সিঙ্গলটন ডিজাইন প্যাটার্নটি ব্যবহার করা উচিত যখন আমাদের নিশ্চিত করা দরকার যে নির্দিষ্ট শ্রেণীর কেবলমাত্র একটি উদাহরণ তৈরি হচ্ছে এবং তারপরে পুরো প্রয়োগের জন্য সেই দৃষ্টিতে সাধারণ বৈশ্বিক অ্যাক্সেস সরবরাহ করতে হবে।
রিয়েল-টাইম দৃশ্যাবলী যেখানে আপনি সিঙ্গলটন ডিজাইনের প্যাটার্নটি ব্যবহার করতে পারেন: পরিষেবা প্রক্সি: যেমন আমরা জানি যে কোনও সার্ভিস এপিআই আবেদন করা একটি অ্যাপ্লিকেশনটির একটি বিস্তৃত ক্রিয়াকলাপ। প্রক্রিয়াটি যে বেশিরভাগ সময় নেয় সেবার পরিষেবা API শুরু করার জন্য পরিষেবা ক্লায়েন্ট তৈরি করা হয়। আপনি যদি সিঙ্গেলটন হিসাবে পরিষেবা প্রক্সি তৈরি করেন তবে এটি আপনার অ্যাপ্লিকেশনটির কার্যকারিতা উন্নত করবে।
মুখোমুখি: আপনি একক হিসাবে ডেটাবেস সংযোগ তৈরি করতে পারেন যা অ্যাপ্লিকেশনটির কার্যকারিতা উন্নত করতে পারে।
লগস: একটি অ্যাপ্লিকেশনটিতে, কোনও ফাইলে আই / ও অপারেশন করা একটি ব্যয়বহুল ক্রিয়াকলাপ। আপনি যদি সিঙ্গলটন হিসাবে আপনাকে লগার তৈরি করেন তবে এটি আই / ও ক্রিয়াকলাপের কার্যকারিতা উন্নত করবে।
ডেটা ভাগ করা: আপনার যদি কোনও ধ্রুবক মান বা কনফিগারেশন মান থাকে তবে আপনি এই মানগুলি সিঙ্গলটনে রাখতে পারেন যাতে অ্যাপ্লিকেশনের অন্যান্য উপাদানগুলি সেগুলি পড়তে পারে।
ক্যাচিং: আমরা যেমন জানি যে একটি ডাটাবেস থেকে ডেটা আনা একটি সময় সাপেক্ষ প্রক্রিয়া। আপনার অ্যাপ্লিকেশনটিতে, আপনি মেমরিতে মাস্টার এবং কনফিগারেশনকে ক্যাশে করতে পারেন যা ডিবি কলগুলি এড়াতে পারে। এই পরিস্থিতিতে, সিঙ্গলটন ক্লাসটি দক্ষ পদ্ধতিতে থ্রেড সিঙ্ক্রোনাইজেশন সহ ক্যাচিং পরিচালনা করতে ব্যবহার করা যেতে পারে যা অ্যাপ্লিকেশনটির কর্মক্ষমতা তাত্পর্যপূর্ণভাবে উন্নত করে।
সি # তে সিঙ্গেলন ডিজাইন প্যাটার্নের অসুবিধাগুলি সি # তে সিঙ্গেলটন ডিজাইন প্যাটার্নটি ব্যবহারের অসুবিধাগুলি নিম্নরূপ:
ইউনিট পরীক্ষা করা খুব কঠিন কারণ এটি একটি গ্লোবাল স্টেটকে একটি অ্যাপ্লিকেশনটির সাথে পরিচয় করে। এটি একটি প্রোগ্রামের মধ্যে সমান্তরালতার সম্ভাবনা হ্রাস করে কারণ একাধিক-থ্রেড পরিবেশে সিঙ্গলটন উদাহরণটি অ্যাক্সেস করতে আপনাকে লকিং ব্যবহার করে অবজেক্টটি সিরিয়ালাইজ করতে হবে।
আমি নিম্নলিখিত নিবন্ধ থেকে এটি নিয়েছি।
https://dotnettutorials.net/lesson/singleton-design-pattern/
লক ব্যবহার না করে নিরাপদ সিঙ্গলটন থ্রেড করুন এবং কোনও অলস তাত্পর্য নেই le
এই বাস্তবায়নের একটি স্থির নির্মাতা রয়েছে, সুতরাং এটি অ্যাপ্লিকেশন ডোমেন প্রতি একবারই কার্যকর করে।
public sealed class Singleton
{
static Singleton(){}
private Singleton(){}
public static Singleton Instance { get; } = new Singleton();
}