الگوهای طراحی در حقیقت راه حل هایی برای مشکلات پر تکرار در برنامه نویسی شی گرا هستند که به سبب تکرار زیاد این مشکلات، راه حل های ثابتی برای حل آن که همان Design pattern ها هستند به وجود آمده است. هر Design Patterns یک ساختار حل مشکل در اختیار شما قرار می دهد که می تواند در موقعیت های مختلف مورد استفاده قرار گیرد و در سطح طراحی روی نرم افزار مطرح شود. الگوهای طراحی نمونه ای از بهترین راه حل ها برای برطرف کردن مشکلات در طراحی نرم افزار هستند.
الگوهای طراحی سبب افزایش سرعت در توسعه نرم افزار و ایجاد یک زبان مشترک و خلاصه بین توسعه دهندگان می شود. استفاده از این الگوها باعث تشویق برنامه نویسان مبتدی به یادگیری و فهم آن ها می شود. علاوه بر این، در نظر گرفتن الگوهای طراحی در توسعه نرم افزار باعث می شود که شخص در سطح طراحی نرم افزار و نه جزئیات پیاده سازی فکر کند.
تصور برخی از افراد این است که اگر یک برنامه نویس تسلط خوبی روی مفاهیم شی گرایی داشته باشد، با رعایت قواعد و قوانین شی گرا به یک طراحی بی عیب و نقص و بهینه می رسد و دیگر نیازی به یادگیری الگو های طراحی ندارد که این تصور کاملا اشتباه است. تسلط خوب و کامل روی طراحی شی گرا لزوماً سبب سوق پیدا کردن خودکار شخص به سمت الگوی های طراحی نمی شود. الگوهای طراحی به طور مستقیم با اصول و قواعد شی گرایی مرتبط نیستند بلکه می توان گفت که Design Patterns ها برای حل مشکلات طراحی شی گرا به وجود آمده اند.
انواع الگوهای طراحی
الگوهای طراحی به سه دسته Creational Design Patterns ،Structural Design Patterns و Behavioral Design Pattern تقسیم می شوند.
Creational design patterns
این دسته از الگوهای طراحی با ساخت کلاس ها و شی ها می باشند و شامل الگوهای طراحی زیر هستند:
۱-Abstract Factory : راهی برای کپسوله کردن گروهی از Factory ها که یک ساختار مشترک دارند بدون توجه به پیاده سازی آن ها در اختیار قرار می دهد.
۲-Builder: یک راه حل منعطف برای مشکلات ساخت و ایجاد اشیا ارائه می دهد.
۳-Factory Method: یک interface برای ساخت یک شی تعریف می کند اما به کلاس های زیر مجموعه اجازه می دهد که تصمیم بگیرند شیء از کدام کلاس ایجاد شود.
۴-Object Pool:به جای اختصاص لحظه ای و حذف شی بعد از استفاده، اجازه استفاده از مجموعه اشیا ساخته شده و آماده استفاده را می دهد.
۵-Prototype: اجازه حذف پیچیدگی ساخت اشیا از کلاینت را می دهد.
۶-Singleton: امکان محدود کردن ساخت یک شی از کلاس را می دهد به طوری که از یک کلاس خاص نتوان بیشتر از یک شی ساخت.
Structural design patterns
این دسته از الگوهای طراحی مربوط به ترکیب کلاس ها و شی ها می باشند و شامل Design pattern های زیر هستند:
۱-Adapter: امکان تبدیل Interface یک کلاس را به Interface مورد انتظار client می دهد.
۲-Bridge: امکان جداسازی انتزاع از پیاده سازی را فراهم می کند.بنابراین این دو می توانند مستقل و متفاوت باشند.
۳-Composite: اشیا را به منظور نمایش سلسله مراتبی تبدیل به ساختار درختی می کند.
۴-Decorator: امکان اضافه کردن عملکرد به اشیا به صورت dynamic را فراهم می کند.
۵-Façade: یک سطح بالاتری از interface به منظور راحتی استفاده زیر سیستم ها فراهم می کند.
۶-Flyweight: برای کاهش تعداد شی های ساخته شده همچنین کاهش استفاده از RAM و در نتیجه افزایش کارایی است.
۷-Private class data: برای کنترل دسترسی عمل write در attribute های یک کلاس استفاده می شود. همچنین داده را از متد های استفاده کننده از آن جدا می کند.
۸-Proxy: یک کلاس عملکرد کلاس دیگر را فراهم می کند.
Behavioral design patterns
این دسته از الگوهای طراحی به روابط بین object ها می پردازد و شامل موارد زیر است:
۱-Chain of Responsibility: جلوگیری از ایجاد if else های متوالی و همچنین امکان داینامیک بودن شرایط را فراهم می کند.
۲-Command: امکان کپسوله سازی یک ریکوئست به عناون یک object را فراهم می کند و از طریق آن می توان فرامینی مانند undo کردن request را اجرا نمود.
۳-Interpreter: راهی جهت ارزیابی کردن دستور (گرامر) زبان را فراهم می کند.
۴-Iterator: یک design pattern با کاربرد بالا، در جاوا و .Net می باشد. این الگوی طراحی امکان استفاده از المان های یک collection را به ترتیب فراهم می کند بدون اینکه client درگیر مواردی همچون دانستن تعداد خانه های یک collection شود.
۵-Mediator: یک شی به منظور کپسوله کردن روابط بین اشیا ایجاد می کند.
۶-Memento:امکان restore کردن حالت یک شی به حالت قبلی را فراهم می کند. (save در بازی های کامپیوتری از این منطق پیروی می کند.)
۷-Null Object: یک عملکرد پیش فرض برای کیس هایی که دیتا در دسترس ندارند فراهم می کند و کاربرد آن در تست نرم افزار است.
۸-Observer: الگوی طراحی Observer یک رابطه یک به چند بین اشیاء تعریف می کند و زمانی که حالت یک شیء تغییر می کند بقیه اشیاء نیز متوجه تغییر حالت شده و متناسب با آن می توانند تغییر کنند.
۹-State: رفتار یک کلاس با توجه به تغییر state داخلی آن می تواند تغییر کند.
۱۰-Strategy: الگوی طراحی استراتژی (Strategy Design Pattern) امکان تعریف خانواده ای از یک الگوریتم را فراهم و کپسوله سازی می کند و امکان استفاده از هر الگوریتم به جای الگوریتم دیگر را فراهم می کند. مانند الگوریتم های مختلف مرتب سازی.
۱۱-Template Method: امکان تغییر برخی مراحل یک الگوریتم توسط زیر کلاس ها بدون تغییر structure کلی آن الگوریتم را فراهم می کند.
۱۲-Visitor: امکان تغییر اجرای یک الگوریتم یک المان کلاس را فراهم می کند.
منابع:
۱- sourcemaking
۲-Headfirst Design Pattern