‫بررسی‬‫های‬‫الگو‬‫طراحی‬
Singleton‫و‬Chain of Responsibility
‫صالحی‬ ‫سروش‬
‫مهندسی‬‫افزار‬‫نرم‬‫پیش‬‫رفته‬
Singleton
CREATIONAL PATTERN
Singleton-Intent
‫هدف‬
◦‫نمونه‬ ‫آن‬ ‫به‬ ‫سراسری‬ ‫دسترسی‬ ‫نقطه‬ ‫و‬ ‫کالس‬ ‫یک‬ ‫از‬ ‫نمونه‬ ‫یک‬ ‫تنها‬ ‫وجود‬ ‫از‬ ‫اطمینان‬.[1]
◦‫نمونه‬ ‫ساخت‬ ‫تعداد‬ ‫میزان‬ ‫به‬ ‫توجه‬ ‫بدون‬ ‫نمونه‬ ‫یک‬ ‫تنها‬ ‫وجود‬ ‫از‬ ‫اطمینان‬.[2]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 3
Singleton-Motivation
‫انگیزش‬
◦‫از‬ ‫برخی‬ ‫برای‬‫ها‬‫کالس‬‫داشتن‬‫نمونه‬ ‫یک‬ ‫تنها‬‫دارد‬ ‫اهمیت‬ ‫کالس‬ ‫آن‬ ‫از‬.
◦‫سیستم‬ ‫یک‬ ‫در‬‫اما‬ ‫داریم‬ ‫چاپگر‬ ‫چندین‬‫تنها‬‫به‬‫یک‬‫داریم‬ ‫نیاز‬ ‫چاپگر‬ ‫صف‬.
◦‫هر‬ ‫برای‬‫عامل‬‫سیستم‬‫داریم‬ ‫فایل‬ ‫سیستم‬ ‫یک‬ ‫تنها‬.
◦‫نشانگر‬ ‫یک‬ ‫تنها‬‫موس‬‫داریم‬ ‫نیاز‬ ‫سیستم‬ ‫در‬.
‫حل‬ ‫راه‬
◦‫بگذاریم‬ ‫کالس‬ ‫خود‬ ‫عهده‬ ‫به‬ ‫را‬ ‫نمونه‬ ‫بودن‬ ‫فرد‬ ‫به‬ ‫منحصر‬ ‫بررسی‬ ‫مسئولیت‬.
◦‫کالس‬‫تواند‬‫می‬‫نش‬ ‫ساخته‬ ‫دیگری‬ ‫نمونه‬ ‫شود‬ ‫مطمئن‬ ‫جدید‬ ‫نمونه‬ ‫ساخت‬ ‫درخواست‬ ‫از‬ ‫جلوگیری‬ ‫با‬‫ود‬.
◦‫دهد‬ ‫ارائه‬ ‫نمونه‬ ‫به‬ ‫دسترسی‬ ‫برای‬ ‫راهی‬ ‫باید‬ ‫کالس‬.
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 4
Singleton-Applicability
‫کاربرد‬
‫الگوی‬ ‫از‬ ‫زمانی‬Singleton‫استفاده‬‫شود‬‫می‬‫که‬:
◦‫کاربران‬ ‫توسط‬ ‫نمونه‬ ‫این‬ ‫و‬ ‫باشیم‬ ‫داشته‬ ‫کالس‬ ‫از‬ ‫نمونه‬ ‫یک‬ ‫دقیقا‬ ‫باید‬‫پذیر‬‫دسترس‬‫باشد‬[1]
◦‫توسط‬ ‫باید‬ ‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫یک‬‫کالس‬‫زیر‬‫تغییر‬ ‫بدون‬ ‫کاربران‬ ‫و‬ ‫بپذیرد‬ ‫توسعه‬‫کدشا‬‫ن‬‫توسعه‬ ‫نمونه‬ ‫به‬
‫داشته‬ ‫دسترسی‬ ‫یافته‬‫باشند‬[1]
◦‫منابع‬ ‫از‬ ‫استفاده‬ ‫محدودیت‬[2]
◦‫حساس‬ ‫شی‬ ‫به‬ ‫دسترسی‬ ‫محدودیت‬(‫مهم‬)‫نمونه‬ ‫چندین‬ ‫توسط‬[2]
◦‫بین‬ ‫داده‬ ‫اشتراک‬‫اشیاء‬[2]
◦‫کالس‬‫نگار‬ ‫واقعه‬(logger)[4]
◦‫کالس‬‫پیکربندی‬‫تنظیمات‬‫یک‬‫برنامه‬[4]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 5
Singleton-Structure
‫ساختار‬
Singleton
Static Instance()
SingletonOperation()
GetSingletonData()
Static uniqueInstance
SingletonData
Return uniqueInstance
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 6
‫الگوی‬ ‫ساختار‬Singleton[1]
Singleton-Structure
‫ساختار‬
Singleton
-Instance:Singleton
-Singleton()
+Static Instance():Singleton
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 7
‫الگوی‬ ‫ساختار‬Singleton[3]
Client
Singleton-Participants
‫شرکت‬‫کنندگان‬
◦‫کالس‬Singleton‫است‬ ‫خودش‬ ‫یکتای‬ ‫نمونه‬ ‫ساخت‬ ‫مسئول‬
◦‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫به‬ ‫کاربر‬ ‫دسترسی‬ ‫برای‬ ‫تابع‬ ‫یک‬
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 8
Singleton-Collaborations
‫همکاران‬
◦‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫به‬ ‫کاربران‬singleton‫طریق‬ ‫از‬‫دسترسی‬ ‫تابع‬ ‫یک‬‫دارند‬.
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 9
Singleton-Consequences
‫پیامدها‬
‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫به‬ ‫دسترسی‬ ‫کنترل‬
‫نام‬ ‫فضای‬ ‫کاهش‬
‫نمایش‬ ‫و‬ ‫عملیات‬ ‫پاالیش‬ ‫مجوز‬
‫از‬ ‫متغیر‬ ‫تعداد‬ ‫مجوز‬‫ها‬‫نمونه‬
‫تر‬‫منعطف‬‫عملیات‬ ‫به‬ ‫نسبت‬‫کالس‬
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 10
Singleton-Implementation
‫سازی‬‫پیاده‬
‫های‬‫چالش‬‫سازی‬‫پیاده‬‫الگو‬:
◦‫یکتا‬ ‫نمونه‬ ‫یک‬ ‫تضمین‬
◦‫استفاده‬Singleton‫در‬‫های‬‫سیستم‬‫نخی‬ ‫چند‬
◦‫کالس‬ ‫از‬ ‫بری‬ ‫ارث‬Singleton
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 11
Singleton-Sample Code
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 12
public sealed class SingleTon
{
private static volatile SingleTon Instance;
private static object _lock = new object();
public String Name;
private SingleTon() { }
public static SingleTon Getinstance()
{
if (Instance == null)
{
lock (_lock)
{
if (Instance == null)
Instance = new SingleTon();
}
}
return Instance;
}
}
‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Singleton‫زبان‬ ‫با‬C#
‫کد‬ ‫نمونه‬[4]
◦‫ناممکن‬‫کالس‬ ‫از‬ ‫خارج‬ ‫نمونه‬ ‫ایجاد‬ ‫بودن‬‫مستق‬ ‫بطور‬‫یم‬
◦‫بری‬ ‫ارث‬ ‫قابل‬ ‫غیر‬
◦‫در‬ ‫امن‬‫های‬‫محیط‬‫نخی‬ ‫چند‬
◦lazy instantiation
Singleton-Sample Code
‫کد‬ ‫نمونه‬[4]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 13
private void button1_Click(object sender, EventArgs e)
{
SingleTon S = SingleTon.Getinstance();
SingleTon S2 = SingleTon.Getinstance();
S.Name = “Singleton Pattern”;
MessageBox.Show(S2.Name);
}
‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Singleton‫زبان‬ ‫با‬C#
‫فرد‬ ‫به‬ ‫منحصر‬ ‫شی‬ ‫به‬ ‫دسترسی‬ ‫سراسری‬ ‫نقطه‬
‫خروجی‬:Singleton Pattern
Singleton-Related Patterns
‫های‬‫الگو‬‫مرتبط‬
◦Abstract Factory
◦Builder
◦Prototype
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 14
Multiton
EXTENSION OF THE SINGLETON PATTERN
Multiton
‫هدف‬
◦‫از‬ ‫محدودی‬ ‫تعداد‬ ‫وجود‬ ‫تضمین‬‫های‬‫نمونه‬‫کلید‬ ‫یک‬ ‫تعیین‬ ‫با‬ ‫کالس‬ ‫یک‬(key)‫اجازه‬ ‫و‬ ‫نمونه‬ ‫هر‬ ‫برای‬
‫کلید‬ ‫هر‬ ‫ایجاد‬ ‫برای‬ ‫شی‬ ‫یک‬ ‫تنها‬.[5]
‫طراحی‬ ‫الگوی‬ ‫توسعه‬Singleton
◦‫از‬ ‫گروهی‬ ‫قابلیت‬‫های‬‫کالس‬Singleton[5]
‫کاربرد‬
◦‫کننده‬ ‫کنترل‬ ‫شی‬ ‫یک‬ ‫نیازمند‬ ‫امنیتی‬ ‫دوربین‬[5]
◦‫نگار‬ ‫واقعه‬‫ها‬‫فایل‬،‫ها‬‫ایمیل‬،...
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 16
Multiton
-Instance:Dictionary<key,Multiton>
-Multiton()
+GetMultiton(key):Multiton
‫الگوی‬ ‫ساختار‬Multiton[5]
Sample Code
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 17
‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Multiton‫زبان‬ ‫با‬C#
‫کد‬ ‫نمونه‬[5]
public sealed class Camera
{
static Dictionary<int, Camera> _cameras = new Dictionary<int, Camera>();
static object _lock = new object();
private Camera()
{
HardwareId = Guid.NewGuid();
}
public static Camera GetCamera(int cameraCode)
{
lock (_lock)
{
if (!_cameras.ContainsKey(cameraCode))
_cameras.Add(cameraCode, new Camera());
}
return _cameras[cameraCode];
}
public Guid HardwareId
{
get; private set;
}
}
Camera cam1a = Camera.GetCamera(1);
Camera cam1b = Camera.GetCamera(1);
Camera cam2a = Camera.GetCamera(2);
Camera cam2b = Camera.GetCamera(2);
Console.WriteLine(cam1a.HardwareId);
Console.WriteLine(cam1b.HardwareId);
Console.WriteLine(cam2a.HardwareId);
Console.WriteLine(cam2b.HardwareId);
/* OUTPUT
86f5983c-08ed-483a-1e79-26557c4bd4e1
86f5983c-08ed-483a-1e79-26557c4bd4e1
8a8b1350-3b11-432c-916e-4e5f8aea70ac
8a8b1350-3b11-432c-916e-4e5f8aea70ac
*/
Chain of Responsibility
BEHAVIORAL PATTERN
Chain of Responsibility-Intent
‫هدف‬
◦‫از‬ ‫جلوگیری‬‫بین‬ ‫اتصال‬‫کننده‬ ‫دریافت‬ ‫و‬ ‫کننده‬ ‫درخواست‬،‫درخواست‬‫وسیله‬ ‫به‬‫به‬ ‫دادن‬ ‫فرصت‬‫ب‬‫یک‬ ‫از‬ ‫یش‬
‫درخواست‬ ‫به‬ ‫رسیدگی‬ ‫برای‬ ‫شی‬.[1]
◦‫پایان‬ ‫و‬ ‫آغاز‬‫ها‬‫درخواست‬‫لوله‬ ‫خط‬ ‫یک‬ ‫با‬‫پردازشی‬‫تعدادی‬ ‫شامل‬ ‫که‬‫گرداننده‬‫است‬.[3]
◦‫پیوندی‬ ‫لیست‬ ‫یک‬‫گرا‬‫شی‬‫با‬‫پیمایش‬‫بازگشتی‬.[3]
◦‫بین‬ ‫ارتباط‬ ‫مورد‬ ‫در‬ ‫تماما‬ ‫الگو‬ ‫این‬‫اشیاء‬‫در‬‫ای‬‫زنجیره‬‫از‬‫ها‬‫سازی‬‫آگاه‬‫است‬.[2]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 19
Chain of Responsibility-Motivation (1)
‫انگیزش‬
◦‫مدیریت‬‫استثناءها‬‫زبان‬ ‫در‬‫نویسی‬‫برنامه‬C#[5]
◦‫خودکار‬ ‫فروش‬ ‫دستگاه‬(vending machine)[4]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 20
Chain of Responsibility-Motivation (2)
‫انگیزش‬
◦‫درخواست‬‫میان‬ ‫از‬‫ای‬‫زنجیره‬‫از‬‫اشیاء‬‫عبور‬‫کند‬‫می‬‫از‬ ‫یکی‬ ‫که‬ ‫زمانی‬ ‫تا‬‫ها‬‫آن‬‫بدهد‬ ‫را‬ ‫او‬ ‫نیاز‬ ‫پاسخ‬.
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 21
‫کاربر‬ ‫درخواست‬
‫موجودیت‬‫پردازشی‬
‫موجودیت‬‫پردازشی‬
‫موجودیت‬‫پردازشی‬
‫موجودیت‬‫پردازشی‬
‫کپسوله‬‫کردن‬‫های‬‫موجودیت‬‫گر‬‫پردازش‬‫انتزاعی‬ ‫لوله‬ ‫خط‬ ‫درون‬[3]
Chain of Responsibility-Applicability
‫کاربرد‬
◦‫یک‬ ‫به‬ ‫رسیدگی‬‫شی‬ ‫یک‬ ‫از‬ ‫بیش‬ ‫با‬ ‫درخواست‬‫پذیر‬‫امکان‬‫باشد‬.[1]
◦‫پاسخ‬‫شود‬ ‫مشخص‬ ‫خودکار‬ ‫صورت‬ ‫به‬ ‫باید‬ ‫درخواست‬ ‫به‬ ‫دهنده‬.[1]
◦‫بفرستیم‬ ،‫گیرنده‬ ‫صریح‬ ‫کردن‬ ‫مشخص‬ ‫بدون‬ ‫شی‬ ‫چندین‬ ‫از‬ ‫یکی‬ ‫به‬ ‫را‬ ‫درخواست‬ ‫یک‬ ‫بخواهیم‬.[1]
◦‫از‬ ‫ای‬ ‫مجموعه‬ ‫بودن‬ ‫پویا‬ ‫الزام‬‫اشیاء‬‫که‬‫توانند‬‫می‬‫کنند‬ ‫مدیریت‬ ‫را‬ ‫درخواست‬ ‫یک‬.[1]
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 22
Chain of Responsibility-Structure
‫ساختار‬
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 23
ConcreteHandler1
HandleRequest()
Client Handler
HandleRequest()
successor
ConcreteHandler2
HandleRequest()
‫الگوی‬ ‫ساختار‬Chain of Responsibility-Structure[1]
Chain of Responsibility-Participants
‫اجزاء‬
Handler
◦‫درخواست‬ ‫به‬ ‫رسیدگی‬ ‫برای‬ ‫کاربری‬ ‫واسط‬ ‫تعریف‬
◦‫سازی‬‫پیاده‬‫جانشین‬ ‫پیوند‬(‫اختیاری‬)
ConcreteHandler
◦‫دسترسی‬‫جانشین‬ ‫به‬
◦‫پاسخ‬‫خود‬ ‫جانشین‬ ‫به‬ ‫درخواست‬ ‫فرستادن‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫امکان‬ ‫صورت‬ ‫در‬ ‫درخواست‬ ‫به‬
Client
◦‫فرستادن‬‫به‬ ‫درخواست‬‫زنجیره‬ ‫شی‬ ‫اولین‬(ConcreteHandler)
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 28
Chain of Responsibility-Collaborations
‫همکاران‬
◦‫صادر‬ ‫را‬ ‫درخواستی‬ ‫کاربر‬ ‫یک‬ ‫که‬ ‫زمانی‬‫کند‬‫می‬‫منتشر‬ ‫زنجیره‬ ‫روی‬ ‫درخواست‬ ،‫شود‬‫می‬‫ک‬ ‫زمانی‬ ‫تا‬‫یک‬ ‫ه‬
‫شی‬ConcreteHandler‫دهد‬ ‫پاسخ‬ ‫آن‬ ‫به‬.
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 29
Chain of Responsibility-Consequences
‫پیامدها‬
◦‫کاهش‬‫و‬ ‫دهنده‬ ‫درخواست‬ ‫بین‬ ‫پیوستگی‬‫ای‬‫شی‬‫را‬ ‫درخواست‬ ‫پاسخ‬ ‫که‬‫دهد‬‫می‬
◦‫افزایش‬‫تخصیص‬ ‫در‬ ‫انعطاف‬‫ها‬‫مسئولیت‬‫به‬‫اشیاء‬
◦‫دریافت‬ ‫برای‬ ‫تضمینی‬‫ندارد‬ ‫وجود‬ ‫پاسخ‬
◦‫جانشین‬ ‫تعیین‬ ‫در‬ ‫زیاد‬ ‫دقت‬ ‫نیازمند‬
◦‫مشکل‬Broken Chain
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 30
Chain of Responsibility-Implementation
‫سازی‬‫پیاده‬
‫های‬‫چالش‬‫سازی‬‫پیاده‬
◦‫سازی‬‫پیاده‬‫زنجیر‬ ‫جانشین‬
◦‫اتصال‬‫ها‬‫جانشین‬
◦‫توصیف‬‫ها‬‫درخواست‬
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 31
Chain of Responsibility-Sample Code
‫سکه‬ ‫با‬ ‫خودکار‬ ‫فروش‬ ‫دستگاه‬[5]
◦‫سکه‬ ‫یک‬ ‫دستگاه‬ ‫ورودی‬
◦‫آن‬ ‫قطر‬ ‫و‬ ‫وزن‬ ‫به‬ ‫توجه‬ ‫با‬ ‫سکه‬ ‫مقدار‬ ‫تعیین‬ ‫دستگاه‬ ‫وظیفه‬
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 32
public class Coin
{
public float Weight { get; set; }
public float Diameter { get; set; }
}
Chain of Responsibility-Sample Code
‫کالس‬Handler
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 33
public abstract class CoinHandlerBase
{
protected CoinHandlerBase _successor;
public abstract void HandleCoin(Coin coin);
public void SetSuccessor(CoinHandlerBase successor)
{
_successor = successor;
}
}
Chain of Responsibility-Sample Code
‫های‬‫کالس‬ConcreteHandler
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 34
public class FivePenceHandler : CoinHandlerBase
{
public override void HandleCoin(Coin coin)
{
if (Math.Abs(coin.Weight - 3.25) < 0.02 && Math.Abs(coin.Diameter - 18) < 0.1)
Console.WriteLine("Captured 5p");
else if (_successor != null)
_successor.HandleCoin(coin);
}
}
public class TwentyPenceHandler : CoinHandlerBase { …. }
public class FiftyPenceHandler : CoinHandlerBase { …. }
public class OnePoundHandler : CoinHandlerBase { …. }
public class TenPenceHandler : CoinHandlerBase { …. }
Chain of Responsibility-Sample Code
‫کالس‬Client
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 35
CoinHandlerBase h5 = new FivePenceHandler();
CoinHandlerBase h10 = new TenPenceHandler();
CoinHandlerBase h20 = new TwentyPenceHandler();
CoinHandlerBase h50 = new FiftyPenceHandler();
CoinHandlerBase h100 = new OnePoundHandler();
h5.SetSuccessor(h10);
h10.SetSuccessor(h20);
h20.SetSuccessor(h50);
h50.SetSuccessor(h100);
Coin tenPence = new Coin { Diameter = 24.49F, Weight = 6.5F };
Coin fiftyPence = new Coin { Diameter = 27.31F, Weight = 8.01F };
Coin counterfeitPound = new Coin { Diameter = 22.5F, Weight = 9F };
h5.HandleCoin(tenPence);
h5.HandleCoin(fiftyPence);
h5.HandleCoin(counterfeitPound);
/* OUTPUT
Captured 10p
Captured 50p
*/
Chain of Responsibility-Related Patterns
‫مرتبط‬ ‫الگوهای‬
◦Composite
SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 36
‫شما‬ ‫توجه‬ ‫از‬ ‫تشکر‬ ‫با‬
Me Other Students Teacher
‫مراجع‬
[1] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns: Elements of
Reusable Object-Oriented Software, Addison-Wesley
[2] Steve Holzner Ph.D., Design Patterns For Dummies, Design Patterns For Dummies
[3] https://sourcemaking.com/design_patterns
[4] http://www.oodesign.com
[5] http://www.blackwasp.co.uk/DesignPatternsArticles.aspx

بررسی الگو‌های طراحی Singleton و Chain of Responsibility

  • 1.
    ‫بررسی‬‫های‬‫الگو‬‫طراحی‬ Singleton‫و‬Chain of Responsibility ‫صالحی‬‫سروش‬ ‫مهندسی‬‫افزار‬‫نرم‬‫پیش‬‫رفته‬
  • 2.
  • 3.
    Singleton-Intent ‫هدف‬ ◦‫نمونه‬ ‫آن‬ ‫به‬‫سراسری‬ ‫دسترسی‬ ‫نقطه‬ ‫و‬ ‫کالس‬ ‫یک‬ ‫از‬ ‫نمونه‬ ‫یک‬ ‫تنها‬ ‫وجود‬ ‫از‬ ‫اطمینان‬.[1] ◦‫نمونه‬ ‫ساخت‬ ‫تعداد‬ ‫میزان‬ ‫به‬ ‫توجه‬ ‫بدون‬ ‫نمونه‬ ‫یک‬ ‫تنها‬ ‫وجود‬ ‫از‬ ‫اطمینان‬.[2] SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 3
  • 4.
    Singleton-Motivation ‫انگیزش‬ ◦‫از‬ ‫برخی‬ ‫برای‬‫ها‬‫کالس‬‫داشتن‬‫نمونه‬‫یک‬ ‫تنها‬‫دارد‬ ‫اهمیت‬ ‫کالس‬ ‫آن‬ ‫از‬. ◦‫سیستم‬ ‫یک‬ ‫در‬‫اما‬ ‫داریم‬ ‫چاپگر‬ ‫چندین‬‫تنها‬‫به‬‫یک‬‫داریم‬ ‫نیاز‬ ‫چاپگر‬ ‫صف‬. ◦‫هر‬ ‫برای‬‫عامل‬‫سیستم‬‫داریم‬ ‫فایل‬ ‫سیستم‬ ‫یک‬ ‫تنها‬. ◦‫نشانگر‬ ‫یک‬ ‫تنها‬‫موس‬‫داریم‬ ‫نیاز‬ ‫سیستم‬ ‫در‬. ‫حل‬ ‫راه‬ ◦‫بگذاریم‬ ‫کالس‬ ‫خود‬ ‫عهده‬ ‫به‬ ‫را‬ ‫نمونه‬ ‫بودن‬ ‫فرد‬ ‫به‬ ‫منحصر‬ ‫بررسی‬ ‫مسئولیت‬. ◦‫کالس‬‫تواند‬‫می‬‫نش‬ ‫ساخته‬ ‫دیگری‬ ‫نمونه‬ ‫شود‬ ‫مطمئن‬ ‫جدید‬ ‫نمونه‬ ‫ساخت‬ ‫درخواست‬ ‫از‬ ‫جلوگیری‬ ‫با‬‫ود‬. ◦‫دهد‬ ‫ارائه‬ ‫نمونه‬ ‫به‬ ‫دسترسی‬ ‫برای‬ ‫راهی‬ ‫باید‬ ‫کالس‬. SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 4
  • 5.
    Singleton-Applicability ‫کاربرد‬ ‫الگوی‬ ‫از‬ ‫زمانی‬Singleton‫استفاده‬‫شود‬‫می‬‫که‬: ◦‫کاربران‬‫توسط‬ ‫نمونه‬ ‫این‬ ‫و‬ ‫باشیم‬ ‫داشته‬ ‫کالس‬ ‫از‬ ‫نمونه‬ ‫یک‬ ‫دقیقا‬ ‫باید‬‫پذیر‬‫دسترس‬‫باشد‬[1] ◦‫توسط‬ ‫باید‬ ‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫یک‬‫کالس‬‫زیر‬‫تغییر‬ ‫بدون‬ ‫کاربران‬ ‫و‬ ‫بپذیرد‬ ‫توسعه‬‫کدشا‬‫ن‬‫توسعه‬ ‫نمونه‬ ‫به‬ ‫داشته‬ ‫دسترسی‬ ‫یافته‬‫باشند‬[1] ◦‫منابع‬ ‫از‬ ‫استفاده‬ ‫محدودیت‬[2] ◦‫حساس‬ ‫شی‬ ‫به‬ ‫دسترسی‬ ‫محدودیت‬(‫مهم‬)‫نمونه‬ ‫چندین‬ ‫توسط‬[2] ◦‫بین‬ ‫داده‬ ‫اشتراک‬‫اشیاء‬[2] ◦‫کالس‬‫نگار‬ ‫واقعه‬(logger)[4] ◦‫کالس‬‫پیکربندی‬‫تنظیمات‬‫یک‬‫برنامه‬[4] SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 5
  • 6.
    Singleton-Structure ‫ساختار‬ Singleton Static Instance() SingletonOperation() GetSingletonData() Static uniqueInstance SingletonData ReturnuniqueInstance SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 6 ‫الگوی‬ ‫ساختار‬Singleton[1]
  • 7.
    Singleton-Structure ‫ساختار‬ Singleton -Instance:Singleton -Singleton() +Static Instance():Singleton SINGLETON &CHAIN OF RESPONSIBILITY DESIGN PATTERNS 7 ‫الگوی‬ ‫ساختار‬Singleton[3] Client
  • 8.
    Singleton-Participants ‫شرکت‬‫کنندگان‬ ◦‫کالس‬Singleton‫است‬ ‫خودش‬ ‫یکتای‬‫نمونه‬ ‫ساخت‬ ‫مسئول‬ ◦‫فرد‬ ‫به‬ ‫منحصر‬ ‫نمونه‬ ‫به‬ ‫کاربر‬ ‫دسترسی‬ ‫برای‬ ‫تابع‬ ‫یک‬ SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 8
  • 9.
    Singleton-Collaborations ‫همکاران‬ ◦‫فرد‬ ‫به‬ ‫منحصر‬‫نمونه‬ ‫به‬ ‫کاربران‬singleton‫طریق‬ ‫از‬‫دسترسی‬ ‫تابع‬ ‫یک‬‫دارند‬. SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 9
  • 10.
    Singleton-Consequences ‫پیامدها‬ ‫فرد‬ ‫به‬ ‫منحصر‬‫نمونه‬ ‫به‬ ‫دسترسی‬ ‫کنترل‬ ‫نام‬ ‫فضای‬ ‫کاهش‬ ‫نمایش‬ ‫و‬ ‫عملیات‬ ‫پاالیش‬ ‫مجوز‬ ‫از‬ ‫متغیر‬ ‫تعداد‬ ‫مجوز‬‫ها‬‫نمونه‬ ‫تر‬‫منعطف‬‫عملیات‬ ‫به‬ ‫نسبت‬‫کالس‬ SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 10
  • 11.
    Singleton-Implementation ‫سازی‬‫پیاده‬ ‫های‬‫چالش‬‫سازی‬‫پیاده‬‫الگو‬: ◦‫یکتا‬ ‫نمونه‬ ‫یک‬‫تضمین‬ ◦‫استفاده‬Singleton‫در‬‫های‬‫سیستم‬‫نخی‬ ‫چند‬ ◦‫کالس‬ ‫از‬ ‫بری‬ ‫ارث‬Singleton SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 11
  • 12.
    Singleton-Sample Code SINGLETON &CHAIN OF RESPONSIBILITY DESIGN PATTERNS 12 public sealed class SingleTon { private static volatile SingleTon Instance; private static object _lock = new object(); public String Name; private SingleTon() { } public static SingleTon Getinstance() { if (Instance == null) { lock (_lock) { if (Instance == null) Instance = new SingleTon(); } } return Instance; } } ‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Singleton‫زبان‬ ‫با‬C# ‫کد‬ ‫نمونه‬[4] ◦‫ناممکن‬‫کالس‬ ‫از‬ ‫خارج‬ ‫نمونه‬ ‫ایجاد‬ ‫بودن‬‫مستق‬ ‫بطور‬‫یم‬ ◦‫بری‬ ‫ارث‬ ‫قابل‬ ‫غیر‬ ◦‫در‬ ‫امن‬‫های‬‫محیط‬‫نخی‬ ‫چند‬ ◦lazy instantiation
  • 13.
    Singleton-Sample Code ‫کد‬ ‫نمونه‬[4] SINGLETON& CHAIN OF RESPONSIBILITY DESIGN PATTERNS 13 private void button1_Click(object sender, EventArgs e) { SingleTon S = SingleTon.Getinstance(); SingleTon S2 = SingleTon.Getinstance(); S.Name = “Singleton Pattern”; MessageBox.Show(S2.Name); } ‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Singleton‫زبان‬ ‫با‬C# ‫فرد‬ ‫به‬ ‫منحصر‬ ‫شی‬ ‫به‬ ‫دسترسی‬ ‫سراسری‬ ‫نقطه‬ ‫خروجی‬:Singleton Pattern
  • 14.
  • 15.
    Multiton EXTENSION OF THESINGLETON PATTERN
  • 16.
    Multiton ‫هدف‬ ◦‫از‬ ‫محدودی‬ ‫تعداد‬‫وجود‬ ‫تضمین‬‫های‬‫نمونه‬‫کلید‬ ‫یک‬ ‫تعیین‬ ‫با‬ ‫کالس‬ ‫یک‬(key)‫اجازه‬ ‫و‬ ‫نمونه‬ ‫هر‬ ‫برای‬ ‫کلید‬ ‫هر‬ ‫ایجاد‬ ‫برای‬ ‫شی‬ ‫یک‬ ‫تنها‬.[5] ‫طراحی‬ ‫الگوی‬ ‫توسعه‬Singleton ◦‫از‬ ‫گروهی‬ ‫قابلیت‬‫های‬‫کالس‬Singleton[5] ‫کاربرد‬ ◦‫کننده‬ ‫کنترل‬ ‫شی‬ ‫یک‬ ‫نیازمند‬ ‫امنیتی‬ ‫دوربین‬[5] ◦‫نگار‬ ‫واقعه‬‫ها‬‫فایل‬،‫ها‬‫ایمیل‬،... SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 16 Multiton -Instance:Dictionary<key,Multiton> -Multiton() +GetMultiton(key):Multiton ‫الگوی‬ ‫ساختار‬Multiton[5]
  • 17.
    Sample Code SINGLETON &CHAIN OF RESPONSIBILITY DESIGN PATTERNS 17 ‫طراحی‬ ‫الگوی‬ ‫کد‬ ‫نمونه‬Multiton‫زبان‬ ‫با‬C# ‫کد‬ ‫نمونه‬[5] public sealed class Camera { static Dictionary<int, Camera> _cameras = new Dictionary<int, Camera>(); static object _lock = new object(); private Camera() { HardwareId = Guid.NewGuid(); } public static Camera GetCamera(int cameraCode) { lock (_lock) { if (!_cameras.ContainsKey(cameraCode)) _cameras.Add(cameraCode, new Camera()); } return _cameras[cameraCode]; } public Guid HardwareId { get; private set; } } Camera cam1a = Camera.GetCamera(1); Camera cam1b = Camera.GetCamera(1); Camera cam2a = Camera.GetCamera(2); Camera cam2b = Camera.GetCamera(2); Console.WriteLine(cam1a.HardwareId); Console.WriteLine(cam1b.HardwareId); Console.WriteLine(cam2a.HardwareId); Console.WriteLine(cam2b.HardwareId); /* OUTPUT 86f5983c-08ed-483a-1e79-26557c4bd4e1 86f5983c-08ed-483a-1e79-26557c4bd4e1 8a8b1350-3b11-432c-916e-4e5f8aea70ac 8a8b1350-3b11-432c-916e-4e5f8aea70ac */
  • 18.
  • 19.
    Chain of Responsibility-Intent ‫هدف‬ ◦‫از‬‫جلوگیری‬‫بین‬ ‫اتصال‬‫کننده‬ ‫دریافت‬ ‫و‬ ‫کننده‬ ‫درخواست‬،‫درخواست‬‫وسیله‬ ‫به‬‫به‬ ‫دادن‬ ‫فرصت‬‫ب‬‫یک‬ ‫از‬ ‫یش‬ ‫درخواست‬ ‫به‬ ‫رسیدگی‬ ‫برای‬ ‫شی‬.[1] ◦‫پایان‬ ‫و‬ ‫آغاز‬‫ها‬‫درخواست‬‫لوله‬ ‫خط‬ ‫یک‬ ‫با‬‫پردازشی‬‫تعدادی‬ ‫شامل‬ ‫که‬‫گرداننده‬‫است‬.[3] ◦‫پیوندی‬ ‫لیست‬ ‫یک‬‫گرا‬‫شی‬‫با‬‫پیمایش‬‫بازگشتی‬.[3] ◦‫بین‬ ‫ارتباط‬ ‫مورد‬ ‫در‬ ‫تماما‬ ‫الگو‬ ‫این‬‫اشیاء‬‫در‬‫ای‬‫زنجیره‬‫از‬‫ها‬‫سازی‬‫آگاه‬‫است‬.[2] SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 19
  • 20.
    Chain of Responsibility-Motivation(1) ‫انگیزش‬ ◦‫مدیریت‬‫استثناءها‬‫زبان‬ ‫در‬‫نویسی‬‫برنامه‬C#[5] ◦‫خودکار‬ ‫فروش‬ ‫دستگاه‬(vending machine)[4] SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 20
  • 21.
    Chain of Responsibility-Motivation(2) ‫انگیزش‬ ◦‫درخواست‬‫میان‬ ‫از‬‫ای‬‫زنجیره‬‫از‬‫اشیاء‬‫عبور‬‫کند‬‫می‬‫از‬ ‫یکی‬ ‫که‬ ‫زمانی‬ ‫تا‬‫ها‬‫آن‬‫بدهد‬ ‫را‬ ‫او‬ ‫نیاز‬ ‫پاسخ‬. SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 21 ‫کاربر‬ ‫درخواست‬ ‫موجودیت‬‫پردازشی‬ ‫موجودیت‬‫پردازشی‬ ‫موجودیت‬‫پردازشی‬ ‫موجودیت‬‫پردازشی‬ ‫کپسوله‬‫کردن‬‫های‬‫موجودیت‬‫گر‬‫پردازش‬‫انتزاعی‬ ‫لوله‬ ‫خط‬ ‫درون‬[3]
  • 22.
    Chain of Responsibility-Applicability ‫کاربرد‬ ◦‫یک‬‫به‬ ‫رسیدگی‬‫شی‬ ‫یک‬ ‫از‬ ‫بیش‬ ‫با‬ ‫درخواست‬‫پذیر‬‫امکان‬‫باشد‬.[1] ◦‫پاسخ‬‫شود‬ ‫مشخص‬ ‫خودکار‬ ‫صورت‬ ‫به‬ ‫باید‬ ‫درخواست‬ ‫به‬ ‫دهنده‬.[1] ◦‫بفرستیم‬ ،‫گیرنده‬ ‫صریح‬ ‫کردن‬ ‫مشخص‬ ‫بدون‬ ‫شی‬ ‫چندین‬ ‫از‬ ‫یکی‬ ‫به‬ ‫را‬ ‫درخواست‬ ‫یک‬ ‫بخواهیم‬.[1] ◦‫از‬ ‫ای‬ ‫مجموعه‬ ‫بودن‬ ‫پویا‬ ‫الزام‬‫اشیاء‬‫که‬‫توانند‬‫می‬‫کنند‬ ‫مدیریت‬ ‫را‬ ‫درخواست‬ ‫یک‬.[1] SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 22
  • 23.
    Chain of Responsibility-Structure ‫ساختار‬ SINGLETON& CHAIN OF RESPONSIBILITY DESIGN PATTERNS 23 ConcreteHandler1 HandleRequest() Client Handler HandleRequest() successor ConcreteHandler2 HandleRequest() ‫الگوی‬ ‫ساختار‬Chain of Responsibility-Structure[1]
  • 24.
    Chain of Responsibility-Participants ‫اجزاء‬ Handler ◦‫درخواست‬‫به‬ ‫رسیدگی‬ ‫برای‬ ‫کاربری‬ ‫واسط‬ ‫تعریف‬ ◦‫سازی‬‫پیاده‬‫جانشین‬ ‫پیوند‬(‫اختیاری‬) ConcreteHandler ◦‫دسترسی‬‫جانشین‬ ‫به‬ ◦‫پاسخ‬‫خود‬ ‫جانشین‬ ‫به‬ ‫درخواست‬ ‫فرستادن‬ ‫صورت‬ ‫این‬ ‫غیر‬ ‫در‬ ‫امکان‬ ‫صورت‬ ‫در‬ ‫درخواست‬ ‫به‬ Client ◦‫فرستادن‬‫به‬ ‫درخواست‬‫زنجیره‬ ‫شی‬ ‫اولین‬(ConcreteHandler) SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 28
  • 25.
    Chain of Responsibility-Collaborations ‫همکاران‬ ◦‫صادر‬‫را‬ ‫درخواستی‬ ‫کاربر‬ ‫یک‬ ‫که‬ ‫زمانی‬‫کند‬‫می‬‫منتشر‬ ‫زنجیره‬ ‫روی‬ ‫درخواست‬ ،‫شود‬‫می‬‫ک‬ ‫زمانی‬ ‫تا‬‫یک‬ ‫ه‬ ‫شی‬ConcreteHandler‫دهد‬ ‫پاسخ‬ ‫آن‬ ‫به‬. SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 29
  • 26.
    Chain of Responsibility-Consequences ‫پیامدها‬ ◦‫کاهش‬‫و‬‫دهنده‬ ‫درخواست‬ ‫بین‬ ‫پیوستگی‬‫ای‬‫شی‬‫را‬ ‫درخواست‬ ‫پاسخ‬ ‫که‬‫دهد‬‫می‬ ◦‫افزایش‬‫تخصیص‬ ‫در‬ ‫انعطاف‬‫ها‬‫مسئولیت‬‫به‬‫اشیاء‬ ◦‫دریافت‬ ‫برای‬ ‫تضمینی‬‫ندارد‬ ‫وجود‬ ‫پاسخ‬ ◦‫جانشین‬ ‫تعیین‬ ‫در‬ ‫زیاد‬ ‫دقت‬ ‫نیازمند‬ ◦‫مشکل‬Broken Chain SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 30
  • 27.
    Chain of Responsibility-Implementation ‫سازی‬‫پیاده‬ ‫های‬‫چالش‬‫سازی‬‫پیاده‬ ◦‫سازی‬‫پیاده‬‫زنجیر‬‫جانشین‬ ◦‫اتصال‬‫ها‬‫جانشین‬ ◦‫توصیف‬‫ها‬‫درخواست‬ SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 31
  • 28.
    Chain of Responsibility-SampleCode ‫سکه‬ ‫با‬ ‫خودکار‬ ‫فروش‬ ‫دستگاه‬[5] ◦‫سکه‬ ‫یک‬ ‫دستگاه‬ ‫ورودی‬ ◦‫آن‬ ‫قطر‬ ‫و‬ ‫وزن‬ ‫به‬ ‫توجه‬ ‫با‬ ‫سکه‬ ‫مقدار‬ ‫تعیین‬ ‫دستگاه‬ ‫وظیفه‬ SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 32 public class Coin { public float Weight { get; set; } public float Diameter { get; set; } }
  • 29.
    Chain of Responsibility-SampleCode ‫کالس‬Handler SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 33 public abstract class CoinHandlerBase { protected CoinHandlerBase _successor; public abstract void HandleCoin(Coin coin); public void SetSuccessor(CoinHandlerBase successor) { _successor = successor; } }
  • 30.
    Chain of Responsibility-SampleCode ‫های‬‫کالس‬ConcreteHandler SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 34 public class FivePenceHandler : CoinHandlerBase { public override void HandleCoin(Coin coin) { if (Math.Abs(coin.Weight - 3.25) < 0.02 && Math.Abs(coin.Diameter - 18) < 0.1) Console.WriteLine("Captured 5p"); else if (_successor != null) _successor.HandleCoin(coin); } } public class TwentyPenceHandler : CoinHandlerBase { …. } public class FiftyPenceHandler : CoinHandlerBase { …. } public class OnePoundHandler : CoinHandlerBase { …. } public class TenPenceHandler : CoinHandlerBase { …. }
  • 31.
    Chain of Responsibility-SampleCode ‫کالس‬Client SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 35 CoinHandlerBase h5 = new FivePenceHandler(); CoinHandlerBase h10 = new TenPenceHandler(); CoinHandlerBase h20 = new TwentyPenceHandler(); CoinHandlerBase h50 = new FiftyPenceHandler(); CoinHandlerBase h100 = new OnePoundHandler(); h5.SetSuccessor(h10); h10.SetSuccessor(h20); h20.SetSuccessor(h50); h50.SetSuccessor(h100); Coin tenPence = new Coin { Diameter = 24.49F, Weight = 6.5F }; Coin fiftyPence = new Coin { Diameter = 27.31F, Weight = 8.01F }; Coin counterfeitPound = new Coin { Diameter = 22.5F, Weight = 9F }; h5.HandleCoin(tenPence); h5.HandleCoin(fiftyPence); h5.HandleCoin(counterfeitPound); /* OUTPUT Captured 10p Captured 50p */
  • 32.
    Chain of Responsibility-RelatedPatterns ‫مرتبط‬ ‫الگوهای‬ ◦Composite SINGLETON & CHAIN OF RESPONSIBILITY DESIGN PATTERNS 36
  • 33.
    ‫شما‬ ‫توجه‬ ‫از‬‫تشکر‬ ‫با‬ Me Other Students Teacher
  • 34.
    ‫مراجع‬ [1] E. Gamma,R. Helm, R. Johnson, and J. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley [2] Steve Holzner Ph.D., Design Patterns For Dummies, Design Patterns For Dummies [3] https://sourcemaking.com/design_patterns [4] http://www.oodesign.com [5] http://www.blackwasp.co.uk/DesignPatternsArticles.aspx

Editor's Notes

  • #13 Sealed اجازه ارث بری از این کلاس را نمی دهد Volatile در محیط چند نخی ممکن است این فیلد تغییر کند
  • #19 رفتاری: ارتباط بین کلاس‌ها یا موجودیت ها
  • #20 رویداد تولید شده توسط یک شی نیاز به رسیدگی توسط شی دیگری داشته باشد