
الگوی طراحـــــــــی Singleton
الگوی طراحی Singleton یکی از الگوهای ایجادی (Creational Patterns) است که هدف آن ایجاد یک کلاس به گونهای است که فقط یک نمونه از آن در طول زمان وجود داشته باشد و همهی کلاسها از این نمونه مشترک استفاده کنند. به این ترتیب، مطمئن میشویم که تنها یک نسخه از کلاس ایجاد میشود و از اشتباهات مربوط به ایجاد چند نسخه از یک کلاس در برنامه جلوگیری میشود.
معمولاً Singleton برای مواردی استفاده میشود که نیاز به ایجاد یک منبع مشترک مثل یک پایگاه داده، یک کش، یک لاگر و غیره داریم که نیاز است از چندین قسمت از برنامه به طور همزمان به آن دسترسی داشته باشند و تعداد زیادی نسخه از آن نمیتوانیم بسازیم.
حالا با یک مثال واقعی و بسیار کاربردی از الگوی Singleton در زبان سی شارپ آشنا میشویم:
فرض کنید در یک سیستم پرداخت آنلاین، نیاز داریم تا یک نمونه از کلاس بانک (Bank) ایجاد کنیم که اطلاعات مربوط به بانک مرتبط با سیستم پرداخت را نگهداری کند. این اطلاعات شامل نام بانک، شماره حساب، کد شعبه و ... است. با استفاده از الگوی Singleton، مطمئن میشویم که تنها یک نمونه از کلاس بانک ایجاد میشود و همهی کلاسهای دیگر سیستم از این نمونه مشترک استفاده میکنند.
1. Singleton (کلاس بانک):
1public class Bank
2{
3 // متغیر ثابت حاوی نمونه ایجاد شده از کلاس بانک
4 private static readonly Bank instance = new Bank();
5
6 // محدود کردن دسترسی به سازنده تا فقط از داخل کلاس بانک قابل دسترسی باشد
7 private Bank()
8 {
9 // اینجا میتوانیم عملیات مورد نیاز برای ایجاد نمونه بانک را انجام دهیم
10 }
11
12 // متد برای دریافت نمونه ایجاد شده از کلاس بانک
13 public static Bank GetInstance()
14 {
15 return instance;
16 }
17
18 // اطلاعات مربوط به بانک
19 public string BankName { get; set; }
20 public string AccountNumber { get; set; }
21 public string BranchCode { get; set; }
22 // ... اطلاعات دیگر
23
24 // متدهای مرتبط با بانک
25 // مثلاً میتوانیم متدهایی برای انجام عملیات پرداخت، برداشت و موارد مشابه دیگر را اضافه کنیم
26}
2. Client (کلاینت):
1public class PaymentSystem
2{
3 public void ProcessPayment()
4 {
5 Bank bank = Bank.GetInstance();
6 // استفاده از نمونه ایجاد شده از کلاس بانک برای انجام پرداخت
7 Console.WriteLine($"Processing payment via {bank.BankName} with account number: {bank.AccountNumber} and branch code: {bank.BranchCode}");
8 // عملیاتهای دیگر مرتبط با پرداخت
9 }
10}
11
12public class Logger
13{
14 public void LogPayment()
15 {
16 Bank bank = Bank.GetInstance();
17
18 // استفاده از نمونه ایجاد شده از کلاس بانک برای ثبت لاگ پرداخت
19 Console.WriteLine($"Logging payment for {bank.BankName} with account number: {bank.AccountNumber} and branch code: {bank.BranchCode}");
20
21 // عملیات
22
23های دیگر مرتبط با ثبت لاگ
24 }
25}
حالا هنگام استفاده از کلاسهای دیگری مانند کلاس PaymentSystem و Logger، همیشه از یک نمونه ایجاد شده از کلاس بانک استفاده میشود و اطلاعات مرتبط با بانک بین این کلاسها به اشتراک گذاشته میشود.
’’ با استفاده از الگوی Singleton در این مثال، ما مطمئن میشویم که همهی کلاسهای برنامه از یک نمونه مشترک از کلاس بانک استفاده میکنند و همگامسازی اطلاعات مربوط به بانک بین این کلاسها به صورت اتوماتیک انجام میشود. این الگو به ما امکان استفاده مشترک و بهینه از منابع را میدهد و از ایجاد چند نسخه از یک منبع جلوگیری میکند. ‘‘