انواع Design pattern به همراه پیاده سازی

الگوهای طراحی (Design Patterns) راه‌حل‌هایی هستند برای مشکلات رایج در طراحی نرم‌افزار. این الگوها بهترین شیوه‌هایی هستند که در صنعت نرم‌افزار به مرور زمان تکامل یافته‌اند. در ادامه چند الگوی طراحی معروف با مثال‌هایی در زبان C# توضیح داده شده‌اند:

معرفی کوتاه انواع الگوریتم های طراحی

Abstract Factory: خانواده هایی از اشیا که اعضای خانواده به یکدیگر مرتبط هستند را تولید می کند.

Adapter: اینترفیسی ایجاد می کند که کلاس هایی که با هم مرتبط نیستند بتوانند با یکدیگر کار کنند.

Bridge" جدا ساختن قسمت پیاده سازی از قسمت انتزاعی یک کلاس برای این که دو طرف بتوانند به راحتی و مستقلا تغییر کنند.

Builder: ساخت يک شی پيجيده را به گونه اي از نمايش آن مجزا مي کند که همان فرآيند ساخت مي تواند نمایش های متفاوتی ایجاد کند.

Chain of Responsibility: در قالب یک زنجیره از اشیا به درخواست کاربر پاسخ می دهد.

Command: مشخص می کند که یک عملیات(operation) چگونه انجام شود و انجام آن ها را مدیریت می کند.

Composite: اشیا را در ساختارهاي درختي ترکيب مي کند. Composite به کاربران اجازه مي دهد با اشیا منفرد و اشیا ترکيبي به طور يکسان برخورد کنند.

Decorator: مسؤوليت هاي اضافي را به طور ديناميک به يک شی ضميمه مي کند . Decorator ها جايگزيني انعطاف پذير جهت طبقه بندي فرعي براي توسعه عملکرد مهيا مي کنند .

Facade: اینترفیسي يکنواخت براي مجموعه ميانجي هاي موجود در يک کلاس فرعي مهيا مي کند . نماي خارجي، اینترفیس سطح بالاتري را تعريف مي کند که استفاده از سيستم فرعي را ساده تر مي کند .

Factory Method: يک اینترفیس جهت ايجاد يک شی تعيين مي کند ، ولي اجازه مي دهد کلاس هاي فرعي تصميم بگيرند کدام کلاس را معرفي کند

Flyweight: زمانی استفاده می شود که تعداد اشیا بسیار زیاد باشد و مدیریت آنها سخت باشد.

Interpreter: جهت تعریف گرامرهای یک زبان و تفسیر جملات استفاده می شود که تنها در طراحی کامپایلرها کاربرد دارد.

Iterator: شيوه اي جهت دسترسي به عناصر يک شی بهم پيوسته به طور متوالي تدارک مي بيند بدون اين که نمايش موجود را دچار مخاطره کند .

Mediator: شیئی را تعيين مي کند که چگونگي تعامل يک مجموعه اشیا را در یک محفظه قرار مي دهد. همچنین باعث می شود که اشیا به طور دو به دو کمتر با هم ارتباط داشته باشند و پدیده ی coupling کمتر شود.

Memento: حالت دروني يک شی را به گونه اي دقيق ذخیره می کند که بعدا بتوان شی را به اين حالت بازگرداند.

Observer: يک وابستگي يک به چند ميان اشیا را به گونه اي تعريف مي کند که هنگامي که يک شی تغيير کند کليه موارد وابسته به آن متوجه شده و به طور خودکار بهنگام سازي شوند .

Prototype: برای ساخت و کپی کردن شیئی جدید که خواص شی اصلی را داشته باشد.

Proxy: براي شی ديگر يک جانشين يا جاي گيرنده فراهم مي کند تا چگونگي دسترسي به آن را کنترل کند .

Singleton: تضمين مي کند که يک کلاس فقط يک نمونه داشته باشد ، و يک نمونه ي کلي جهت دسترسي به آن را مهيا کند .

State: به يک شی اجازه مي دهد هنگامي که حالت دروني آن تغيير کرد رفتار خود را عوض کند . به نظر مي رسد که شی کلاس خود را عوض مي کند .

Strategy: يک خانواده از الگوريتم ها را تعريف کرده ، هر يک را در پوشش قرار داده و آن ها را قابل تعویض مي سازد . استراتژي اجازه مي دهد الگوريتم به طور مستقل از کاربران که از آن استفاد مي کنند متفاوت باشد .

Template Method: اسکلت بندي الگوريتم در يک عمليات را تعريف کرده ، پیاده سازی بعضي مراحل را یه کلاس های فرعی می سپارد. همچنین به کلاس هاي فرعي مجال مي دهد بعضي مراحل يک الگوريتم را بدون تغيير ساختار الگوريتم دوباره تعريف کند .

Visitor: ويزيتور به شما مجال مي دهد عمليات جديد را بدون تغيير کلاس هاي عناصري که در آن کار مي کند تغيير دهيد .

1. الگوی Singleton (تک‌نمونه)

این الگو تضمین می‌کند که از یک کلاس فقط یک نمونه ایجاد شود و یک نقطه دسترسی جهانی به آن فراهم می‌کند.

2. الگوی Factory Method (متد کارخانه‌ای)

این الگو یک رابط برای ایجاد یک شیء تعریف می‌کند اما به زیرکلاس‌ها اجازه می‌دهد نوع شیء ایجاد شده را تغییر دهند.

3. الگوی Observer (ناظر)

این الگو وابستگی یک به چندی بین اشیاء تعریف می‌کند به طوری که وقتی وضعیت یک شیء تغییر کند، تمام وابستگان آن به طور خودکار به‌روزرسانی شوند.

4. الگوی Strategy (استراتژی)

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

5. الگوی Decorator (تزئین‌کننده)

این الگو به شما اجازه می‌دهد تا رفتار یک شیء را بدون تغییر کلاس آن گسترش دهید.

6. الگوی Adapter (مبدل)

این الگو رابط یک کلاس را به رابط دیگری که مشتری انتظار دارد تبدیل می‌کند. این الگو به کلاس‌هایی که نمی‌توانند با هم کار کنند اجازه می‌دهد تا با هم کار کنند.

7. الگوی Composite (ترکیبی)

این الگو به شما اجازه می‌دهد اشیاء را به ساختارهای درختی ترکیب کنید تا نمایش بخشی‌کل ایجاد شود. مشتری می‌تواند با اشیاء منفرد و ترکیب‌ها به شکل یکنواختی رفتار کند.

8. الگوی Command (دستور)

این الگو یک درخواست را به عنوان یک شیء دربرمی‌گیرد و به شما اجازه می‌دهد پارامترهای مختلفی را برای درخواست‌ها، صف‌بندی و اجرای آن‌ها به طور غیرهم‌زمان نگه دارید.

9. الگوی Proxy (پراکسی)

این الگو یک جایگزین یا نگهبان برای دسترسی به یک شیء دیگر است. یک پراکسی می‌تواند کنترل دسترسی، نگهداری، یا بهبود کارایی را فراهم کند.

10. الگوی Chain of Responsibility (زنجیره مسئولیت)

این الگو به یک درخواست اجازه می‌دهد تا توسط چندین شیء پردازش شود. هر شیء درخواست را به شیء بعدی در زنجیره انتقال می‌دهد.

11. الگوی Mediator (میانجی)

این الگو یک شیء را تعریف می‌کند که نحوه تعامل مجموعه‌ای از اشیاء را کپسوله می‌کند. میانجی باعث کاهش وابستگی‌های مستقیم بین اشیاء می‌شود و تعاملات را بهبود می‌بخشد.

12. الگوی State (وضعیت)

این الگو به یک شیء اجازه می‌دهد که رفتار خود را تغییر دهد وقتی وضعیت داخلی‌اش تغییر می‌کند. این الگو به نظر می‌رسد که شیء کلاس خود را تغییر داده است.

13. الگوی Template Method (روش قالب)

این الگو اسکلت یک الگوریتم را در یک متد تعریف می‌کند، در حالی که پیاده‌سازی برخی مراحل را به زیرکلاس‌ها واگذار می‌کند. این الگو به زیرکلاس‌ها اجازه می‌دهد تا مراحل خاصی از یک الگوریتم را بدون تغییر ساختار آن بازنویسی کنند.

14. الگوی Iterator (گردشگر)

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

15. الگوی Memento (یادگار)

این الگو بدون افشای جزئیات پیاده‌سازی داخلی آن، حالت داخلی یک شیء را ذخیره و بازیابی می‌کند.

16. الگوی Flyweight (وزن مگس)

این الگو از اشتراک‌گذاری برای پشتیبانی از مقادیر بزرگ اشیاء ریزدانه استفاده می‌کند. در صورت امکان، داده‌های مشترک بین اشیاء را به اشتراک می‌گذارد تا استفاده از حافظه را کاهش دهد.

17. الگوی Builder (سازنده)

این الگو فرآیند ساخت یک شیء پیچیده را از نمایش نهایی آن جدا می‌کند، به طوری که همان فرآیند ساخت می‌تواند نمایش‌های مختلفی داشته باشد.

18. الگوی Visitor (بازدیدکننده)
این الگو به شما اجازه می‌دهد که یک عملیات جدید را بدون تغییر کلاس‌های اشیاء بر روی یک مجموعه از اشیاء اعمال کنید.


19. الگوی Bridge (پل)
این الگو پیاده‌سازی‌ها را از رابط‌ها جدا می‌کند، به طوری که هر دو بخش می‌توانند مستقل از یکدیگر تغییر کنند.


20. الگوی Facade (نما)
این الگو یک رابط ساده شده برای یک سیستم پیچیده فراهم می‌کند. این الگو باعث می‌شود که استفاده از سیستم‌های پیچیده آسان‌تر شود.


21. الگوی Interpreter (مفسر)
این الگو یک زبان را تعریف و نحوه تفسیر جملات در این زبان را تعیین می‌کند. برای مثال، یک ماشین‌حساب ساده که از این الگو استفاده می‌کند.


22. الگوی Prototype (نمونه اولیه)
این الگو به اشیاء اجازه می‌دهد که از نمونه‌های اولیه خود کپی شوند و تغییرات را در نمونه‌ها ایجاد کنند.


23. الگوی Mediator (میانجی)
این الگو تعاملات پیچیده بین مجموعه‌ای از اشیاء را با معرفی یک شیء میانجی ساده می‌کند.



1. تعریف مدل‌های داده
ابتدا، مدل‌های داده را تعریف می‌کنیم. فرض کنید که ما یک موجودیت ساده به نام Product داریم:


2. تعریف رابط Repository
یک رابط Repository تعریف می‌کنیم که عملیات پایه‌ای را مشخص می‌کند:

4. استفاده از Repository
در نهایت، می‌توانیم از این الگو در لایه سرویس یا کنترلر استفاده کنیم. فرض کنید ما از ASP.NET Core MVC استفاده می‌کنیم:


5. تنظیمات Dependency Injection
در نهایت، باید تنظیمات وابستگی را در Startup.cs برای استفاده از Repository اضافه کنید:

این الگو باعث می‌شود که منطق دسترسی به داده‌ها از منطق تجاری جدا شده و همچنین کد تست‌پذیرتر و قابل نگهداری‌تر باشد.