DesignPatterns icon indicating copy to clipboard operation
DesignPatterns copied to clipboard

simple console project to show design patterns in c#

DesignPatterns

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

علاوه بر توضیحات این فایل در خصوص دیزاین‌پترن‌ها، در کانال یوتوب softwaretalks برنامه‌های ویدئویی توضیحات مربوط به کدهای هر یک از دیزاین‌پترن‌های این مخزن را در این پلی‌لیست می‌توانید مشاهده کنید

Design Pattern چیست؟

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

⚠️ توجه

کدهای این مخزن و توضیحات فارسی این فایل به تدریج تکمیل می‌شوند و بنابراین در حال حاضر همه تعاریف و پیاده‌سازی‌ها را نداریم. همچنین برای سهولت استفاده از کدها در پلتفرم‌های مختلف، کدها به زبان سی‌شارپ و به صورت پروژه کنسول .NET Core نوشته می‌شوند

انواع Desgin Patternها

به طور کلی سه دسته دیزاین‌پترن داریم

  • Creational
  • Structural
  • Behavioral

Creational Design Patterns

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

  • Factory Method
  • Prototype
  • Singleton
  • Builder
  • سایر الگوها به زودی ...

Factory Method

با استفاده از این الگو می‌توانیم ساخت یک شیء را به صورت دینامیک از زیرکلاس‌ها داشته باشیم. ویدئوی مربوط به توضیحات این الگو در کدهای مخزن را از اینجا مشاهده کنید. کدهای مربوط به پیاده‌سازی الگوی Factory Method بر اساس مثال زیر را از اینجا مشاهده کنید. همچنین می‌توانید توضیحات الگوی Factory Method در ویکی‌پدیا فارسی را نیز مطالعه کنید.

مثال

تصور کنید می‌خواهیم به وسیله کد مسئول دولتی بسازیم. هر مسئول دولتی موظف به اجرای قانون در یک حوزه است. بر اساس این تعاریف، یک کلاس وزیر ایجاد می‌کنیم و بر با ارث‌بری از این کلاس (که تعریف Factory Method را در خود دارد) موقع ساخت وزیر جدید، شیء وزیر را با توجه به مسئولیت ایجاد می‌کنیم.

Prototype

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

مثال

فرض کنید برای مدل کردن شعب یک بانک، که کلاسش شامل یک کد شعبه و یک نام مدیر شعبه است، از الگوی پروتوتایپ استفاده کنیم. برای این‌کار بایستی متدی برای Clone کردن شیء شعبه در کلاس شعبه بسازیم و بعد آن را فراخوانی و سپس ویژگی‌های شیء کلون شده را بر حسب نیاز تغییر دهیم

Singleton

این الگو را زمانی استفاده می‌کنیم که بخواهیم یک instance از شیء داشته باشیم و حتی با و هنگام new کردن در صورتی شیء جدیدی ایجاد شود که قبلاً وجود نداشته باشد. می‌توانید توضیحات الگوی Singleton در ویکی‌پدیا فارسی را نیز مطالعه کنید

مثال

در هر لحظه فقط یک رئیس جمهور داریم، پس هر چقدر از کلاس President شیء جدید درست کنیم باز هم باید همان رئیس جمهور برگردانده شود

Builder

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

مثال

فرض کنید یک سیستم مدیریت محتوا داریم که ماژول‌هایی دارد. وقتی یک وب سایت از روی این سیستم مدیریت محتوا می‌سازیم، ممکن است در هر نمونه وب سایت، یک یا چند ماژول مختلف فعال/غیرفعال باشند

Structural Design Patterns

این دیزاین‌پترن‌ها به رابطه بین اشیاء و ساختار آن‌ها مرتبط هستند.

  • Adapter
  • سایر الگوها به زودی ...

Adapter

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

مثال

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

Behavioral Design Patterns

به زودی ...