گروه‌بندی دیزاین پترن‌ها 🌀

1. ساختاری (Structural) 🛠️
البته، الگوهای ساختاری (Structural Design Patterns) به این صورت هستند:

  1. Adapter Pattern (الگوی آداپتور)
  2. Bridge Pattern (الگوی پل)
  3. Composite Pattern (الگوی ترکیبی)
  4. Decorator Pattern (الگوی دکوراتور)
  5. Facade Pattern (الگوی نماینده)
  6. Flyweight Pattern (الگوی سبک‌وزن)

به طور خلاصه، این الگوهای ساختاری به صورت زیر عمل می‌کنند:

1. **Adapter Pattern (الگوی آداپتور):** استفاده می‌شود تا دو واسط متفاوت را به یکدیگر متصل کند.

2. **Bridge Pattern (الگوی پل):** به اشیاء اجازه می‌دهد که از دو سلسله مراتب مستقل استفاده کنند.

3. **Composite Pattern (الگوی ترکیبی):** اجازه می‌دهد گروهی از اشیاء را به صورت سلسله مراتبی مدیریت کند.

4. **Decorator Pattern (الگوی دکوراتور):** به اشیاء اجازه می‌دهد به دینامیکیت و قابلیت افزودن عملکرد در زمان اجرا دست یابند.

5. **Facade Pattern (الگوی نماینده):** ارائه رابط ساده‌تری برای دسترسی به زیرسیستم‌های پیچیده‌تر و دسترسی آسان‌تر به آن‌ها.

6. **Flyweight Pattern (الگوی سبک‌وزن):** بهینه‌سازی استفاده از حافظه و کارایی برای نمونه‌های مشابه.

7. **Proxy Pattern (الگوی نماینده):** اجازه دسترسی به یک شیء دیگر و کنترل بیشتر بر روی آن.

 2. رفتاری (Behavioral) 🔄

الگوهای رفتاری (Behavioral Design Patterns) عبارتند از:

1. **Observer Pattern (الگوی مشاهده‌گر)**
2. **Strategy Pattern (الگوی استراتژی)**
3. **Command Pattern (الگوی دستور)**
4. **Chain of Responsibility Pattern (الگوی زنجیره مسئولیت)**
5. **Iterator Pattern (الگوی تکرارکننده)**
6. **State Pattern (الگوی وضعیت)**
7. **Visitor Pattern (الگوی بازدیدکننده)**

حالا به ترتیب، یک توضیح مختصر برای هر یک:

1. **Observer Pattern (الگوی مشاهده‌گر):** این الگو برای اطلاع‌رسانی از تغییرات یک شیء به سایر شیءها استفاده می‌شود. یک شیء (مشاهده‌گر) تغییرات خود را به سایر شیءها (مشاهده‌کننده‌ها) اعلام می‌کند.

2. **Strategy Pattern (الگوی استراتژی):** این الگو به شیوه‌های مختلفی را برای انجام یک کار مشابه استفاده می‌کند و به اشیاء اجازه می‌دهد استراتژی خود را در زمان اجرا تغییر دهند.

3. **Command Pattern (الگوی دستور):** این الگو اجازه می‌دهد درخواست‌ها یا دستورات را به عنوان یک شیء کپسوله کنید تا از پیچیدگی‌های ارتباط میان ارسال کننده و دریافت کننده جلوگیری شود.

4. **Chain of Responsibility Pattern (الگوی زنجیره مسئولیت):** در این الگو، یک درخواست به یک زنجیر از شیءها ارسال می‌شود و هر شیء مسئولیت خود را بررسی کرده و اقدام یا عبور از آن را تصمیم می‌گیرد.

5. **Iterator Pattern (الگوی تکرارکننده):** این الگو به اشیاء اجازه می‌دهد به طور یکنواخت و بدون افشای جزئیات داخلی یک مجموعه از اشیاء را ارائه دهند.

6. **State Pattern (الگوی وضعیت):** این الگو به یک شیء اجازه می‌دهد وضعیت خود را در زمان اجرا تغییر دهد و به این شیء اجازه می‌دهد که به نظر بیاید که تغییر یافته‌اند.

7. **Visitor Pattern (الگوی بازدیدکننده):** این الگو به شیء اجازه می‌دهد که یک عملیات مشخص را اجرا کند بر اساس نوع دیگر شیءهایی که با آن تعامل دارد.

 3. Creational (ساختنی) 🏗️

الگوهای ساختاری (Creational Design Patterns) شامل این الگوها هستند:

1. **Singleton Pattern (الگوی تک‌نمونه)**
2. **Factory Method Pattern (الگوی متد کارخانه)**
3. **Abstract Factory Pattern (الگوی کارخانه انتزاعی)**
4. **Builder Pattern (الگوی سازنده)**
5. **Prototype Pattern (الگوی اصلی)**
6. **Object Pool Pattern (الگوی استخر اشیاء)**

حالا یک توضیح مختصر برای هر یک:

1. **Singleton Pattern (الگوی تک‌نمونه):** این الگو مطمئن می‌شود که یک کلاس تنها یک نمونه از خودش داشته باشد و اجازه نمی‌دهد که نمونه‌های دیگر از آن ایجاد شود.

2. **Factory Method Pattern (الگوی متد کارخانه):** این الگو اجازه می‌دهد یک کلاس زیر مجموعه ایجاد شود که مشخص می‌کند کدام شیء باید ساخته شود.

3. **Abstract Factory Pattern (الگوی کارخانه انتزاعی):** این الگو اجازه می‌دهد یک رابط برای ایجاد یک مجموعه از اشیاء مرتبط ارائه دهد بدون اینکه جزئیات ساخت آن اشیاء مشخص شود.

4. **Builder Pattern (الگوی سازنده):** این الگو اجازه می‌دهد یک شیء پیچیده را مرحله به مرحله ایجاد کنید تا کاربر اجازه داشته باشد جزئیات ایجاد را تنظیم کند.

5. **Prototype Pattern (الگوی اصلی):** این الگو اجازه می‌دهد یک شیء از یک نمونه اولیه کپی شود تا از هزینه‌های ایجاد یک نمونه جدید جلوگیری شود.

6. **Object Pool Pattern (الگوی استخر اشیاء):** این الگو اشیاء را پیش از زمان لزومی ایجاد می‌کند و آن‌ها را در یک "استخر" نگهداری می‌کند تا مجدداً استفاده شوند و جلوی هزینه‌های ایجاد مجدد اشیاء را می‌گیرد.

 نقش دیزاین پترن‌ها در پروژه‌های بزرگ تحت وب و کلین کد 🌐

- کاهش پیچیدگی: استفاده از دیزاین پترن‌ها در پروژه‌های بزرگ تحت وب و کلین کد باعث کاهش پیچیدگی کد می‌شود. این الگوها کمک می‌کنند تا کد ساده‌تر و قابل فهم‌تری داشته باشیم.

- سهولت توسعه: با استفاده از الگوهای استاندارد، توسعه‌ی نرم‌افزار سریع‌تر و کاراتر می‌شود. برنامه‌نویسان جدید می‌توانند سریع‌تر با کد آشنا شده و بهبودهای لازم را اعمال کنند.

- نگهداری بهتر: استفاده از دیزاین پترن‌ها باعث می‌شود که کد قابل نگهداری و تغییرات باشد. اگر نیاز به تغییراتی در برنامه وجود داشته باشد، اعمال این تغییرات با استفاده از الگوهای استاندارد آسان‌تر می‌شود.