الگوی طراحی

**الگوهای طراحی**  الگوها و مستنداتی از روش‌های حل برای مشکلات رایج در برنامه‌نویسی شیءگرا هستند. این الگوها ابتدا توسط *کریستوف الکساندر* ارائه شد و سپس از سوی گروهی موسوم به *[[دسته چهار]]*  یا به اختصار **GOF** مورد طبقه‌بندی قرار گرفت و تحت عنوان کتابی به نام *الگوهای طراحی* در سال ۱۹۹۴منتشر شد.

کریستوف الکساندر الگوی طراحی را راه حلی برای مسایلی می‌داند که دایماً در محیط اطراف رخ می‌دهد، از این رو می‌توان بدون دوباره کاری در آینده مسایل را با سرعت بالاتری حل نمود.

## تاریخچه
در طراحی نرم‌افزارهای مختلف مسایلی دایماً بروز می‌یابند که در پروژه‌های قبلی، که حتی دارای قلمرو کاربردی  مختلفی هستند، نیز وجود دارند. راه حل موجود برای این روش‌های غالباً یکسان است و یافتن طراحی مناسب برای این موارد تکراری وقت‌گیر و هزینه‌بر است. از این رو می‌توان راه‌حل‌هایی را ارائه نمود که مسایل را ساده نماید. از طرفی روح برنامه‌نویسی شیءگرا بر مبنای قابلیت باز-استفادگی  و جز-محوری  است، موجب ایجاد برنامه‌هایی قابل استفاده در آینده خواهد شد.
اریک گاما ،ریچارد هلم، رالف جانسون، جام ولیسایدز که بعدها به دستهٔ۴ معروف شدند در سال ۱۹۹۴ کتاب الگوهای طراحی را به همراه مقدمه‌ای از سوی گریدی بوش به رشتهٔ تحریر درآوردند. این کتاب به دسته‌بندی ۲۳ الگوهای طراحی می‌پرداخت که تا آن زمان ابداع شده‌بودند. **[[گریدی بوش]]** در مقدمهٔ کتاب *الگوهای طراحی* از الگوهای طراحی به عنوان راه حلی برای ایجاد سیستم‌های پیچیده نام می‌برد و از آن به عنوان زبانی نام می‌برد که می‌تواند بر روی دامنه‌های مختلفی مورد استفاده قرار گیرند.

گاما و همکارانش از ارایهٔ روش تصویری برای هر الگو خودداری نمودند. به جای آن از روش توصیف نوشتاری **آبوت** استفاده نمودند. هر الگو دارای یک قالب است که عبارتند از:
* **نام و طبقه‌بندی**: نام الگو و توصیفی کوتاه برای آن را شامل می‌شود.
* **قصد**: متنی کوتاه در پاسخ به این پرسش که: این الگو چکاری را انجام می‌دهد؟ هدف و تفکر پشت این کار چیست؟ و این الگو چه مسالی را حل می‌نماید؟
* **نام دیگر**: در صورتی که نام شناخته‌شدهٔ دیگری برای آن وجود دارد ذکر گردد.
* **انگیزه**: سناریویی که در آن از الگوی طراحی استفاده شده‌باشد و اینکه چگونه از کلاس و شی برای حل مشکل استفاده شده‌است.
* **قابلیت کاربردی**: توصیفگر شرایط است که این الگو در آن قابل پیاده‌سازی است.
* **ساختار**: یک نمایش گرافیکی است که براساس تکنیک مدلسازی شیء نمایش داده می‌شود *(که امروزه از [[زبان مدل‌سازی یکپارچه]] برای این کار استفاده می‌شود)*
* **شرکت‌کنندگان**: کلاس یا اشیا شرکت‌کننده در الگوی طراحی و بیان مسئولیت‌هایشان.
* **همکاری**: چگونگی همکاری شرکت‌کنندگان در الگو
* **پیاده‌سازی**: نکات پیاده‌سازی را بیان می‌نماید.
* **کد نمونه**: مثالی به زبان سی++ یا اسمال‌تاک *(امروزه زبان [[زبان برنامه‌نویسی جاوا|جاوا]] جایگزین شده‌است)*
* **مثال‌های شناخته‌شده**: مثال‌هایی از کاربرد در سیستم‌های واقعی
* **الگوهای مرتبط**: چه الگوهایی شبیه این الگو هستند؟ و تفاوت‌های اساسی بین آن‌های چیست؟

## دسته‌بندی الگوهای طراحی
این ۲۳ الگوی طراحی، در ۳ گروه زیر دسته‌بندی می‌گردند:
* الگوهای ایجادی 
* الگوهای ساختاری 
* الگوهای رفتاری

### گروه الگوهای ایجادی
:در این گروه الگوهای طراحی زیر وجود دارند:

### گروه الگوهای Structural patterns
:در این گروه الگوهای طراحی زیر وجود دارند:

:* Adapter

:* Bridge

:* Composite

:* Decorator

:* Facade

:* Flyweight

### گروه الگوهای Behavioral patterns
:در این گروه الگوهای طراحی زیر وجود دارند:

:* Chain of responsibility

:* Command

:* Interpreter

:* Iterator

:* Mediator

:* Memento

:* Observer

:* State

:* Strategy

:* Template method

:* Visitor

## پانویس
* Singleton
* Method Factory
* Abstract Factory
* Builder
* Prototype

## منابع

رده:الگوهای طراحی نرم‌افزار
رده:کتاب‌های ۱۹۹۴ (میلادی)
رده:کتاب‌های مهندسی نرم‌افزار
رده:طراحی معماری