الگوهای طراحی (Design Patterns) در برنامه‌نویسی

الگوی طراحی در برنامه‌نویسی، Design Pattern چیست، اصول طراحی نرم‌افزار، شیء‌گرایی در سی‌شارپ 1404/7/16
نویسنده: مدرس بهمن آبادی

 الگوهای طراحی (Design Patterns) در برنامه‌نویسی

الگوهای طراحی

مقدمه

در دنیای برنامه‌نویسی، بسیاری از مشکلاتی که ما امروز با آن‌ها مواجه می‌شویم، قبلاً هم توسط دیگر برنامه‌نویسان حل شده‌اند.
تجربه‌ی چند دهه توسعه نرم‌افزار، مجموعه‌ای از راه‌حل‌های استاندارد برای مشکلات رایج را به وجود آورده که به آن‌ها الگوهای طراحی (Design Patterns) می‌گویند.

الگوهای طراحی به ما کمک می‌کنند تا:

  • کد قابل نگهداری‌تر (Maintainable) بنویسیم،

  • از تکرار منطق جلوگیری کنیم،

  • و برنامه‌ای قابل توسعه (Extensible) بسازیم.

 

تعریف دقیق Design Pattern

design patterns

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

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

دسته‌بندی الگوهای طراحی کلاسیک

در کتاب معروف “Design Patterns: Elements of Reusable Object-Oriented Software” (توسط چهار نویسنده معروف که به "Gang of Four" مشهورند)، الگوها در سه دسته‌ی اصلی تقسیم شده‌اند:

Creational Patterns (الگوهای آفرینشی)

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

الگوهای معروف این دسته:

نام الگوتوضیح کوتاه
Singletonتضمین می‌کند فقط یک شیء از یک کلاس ساخته شود.
Factory Methodایجاد اشیاء را به زیرکلاس‌ها واگذار می‌کند.
Abstract Factoryمجموعه‌ای از کارخانه‌ها برای ایجاد خانواده‌ای از اشیاء مرتبط.
Builderساخت اشیاء پیچیده را مرحله‌به‌مرحله انجام می‌دهد.
Prototypeاشیاء را با کپی کردن نمونه‌های موجود می‌سازد.

مثال: Singleton Pattern در C#

 

public class Logger
{
    private static Logger _instance;
    private static readonly object _lock = new object();

    private Logger() { }

    public static Logger Instance
    {
        get
        {
            lock (_lock)
            {
                return _instance ??= new Logger();
            }
        }
    }

    public void Log(string message)
    {
        Console.WriteLine($"[LOG]: {message}");
    }
}

 

 با این الگو، در کل برنامه فقط یک شیء از کلاس Logger وجود دارد.

 

Structural Patterns (الگوهای ساختاری)

الگوهای ساختاری

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

الگوهای معروف این دسته:

نام الگوتوضیح کوتاه
Adapterدو کلاس ناسازگار را با هم سازگار می‌کند.
Decoratorبدون تغییر کد اصلی، قابلیت جدید به شیء اضافه می‌کند.
Facadeیک رابط ساده برای سیستم‌های پیچیده ارائه می‌دهد.
Compositeکار با گروهی از اشیاء را مثل یک شیء واحد ممکن می‌سازد.
Proxyکنترل دسترسی به یک شیء دیگر را فراهم می‌کند.

 

مثال: Adapter Pattern در C#

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

 

// کلاس اصلی
public class XmlPrinter
{
    public void PrintXml(string xml)
    {
        Console.WriteLine("Printing XML: " + xml);
    }
}

// رابط مورد انتظار
public interface IPrinter
{
    void Print(string text);
}

// آداپتر
public class XmlPrinterAdapter : IPrinter
{
    private readonly XmlPrinter _xmlPrinter;

    public XmlPrinterAdapter(XmlPrinter xmlPrinter)
    {
        _xmlPrinter = xmlPrinter;
    }

    public void Print(string text)
    {
        // تبدیل متن ساده به XML فرضی
        string xml = $"<data>{text}</data>";
        _xmlPrinter.PrintXml(xml);
    }
}

// استفاده
class Program
{
    static void Main()
    {
        IPrinter printer = new XmlPrinterAdapter(new XmlPrinter());
        printer.Print("Hello Design Patterns!");
    }
}

 

 اینجا Adapter بین دو نوع رابط ناسازگار واسطه می‌شود.

 

Behavioral Patterns (الگوهای رفتاری)

این الگوها بر نحوه‌ی تعامل بین اشیاء و توزیع مسئولیت‌ها تمرکز دارند.

الگوهای معروف این دسته:

نام الگوتوضیح کوتاه
Observerزمانی که وضعیت یک شیء تغییر کند، اشیاء دیگر را مطلع می‌کند.
Strategyالگوریتم‌ها را قابل‌تعویض می‌سازد.
Commandدرخواست‌ها را به عنوان شیء ذخیره می‌کند.
Stateرفتار شیء را بر اساس وضعیت داخلی‌اش تغییر می‌دهد.
Mediatorارتباط بین اشیاء را متمرکز می‌کند.

 

 مثال: Observer Pattern در C#

 

public interface IObserver
{
    void Update(string message);
}

public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify(string message);
}

public class NewsAgency : ISubject
{
    private List<IObserver> _observers = new();

    public void Attach(IObserver observer) => _observers.Add(observer);
    public void Detach(IObserver observer) => _observers.Remove(observer);

    public void Notify(string message)
    {
        foreach (var observer in _observers)
            observer.Update(message);
    }
}

public class NewsReader : IObserver
{
    private string _name;

    public NewsReader(string name) => _name = name;

    public void Update(string message)
    {
        Console.WriteLine($"{_name} received news: {message}");
    }
}

// استفاده
class Program
{
    static void Main()
    {
        var agency = new NewsAgency();
        var reader1 = new NewsReader("Ali");
        var reader2 = new NewsReader("Sara");

        agency.Attach(reader1);
        agency.Attach(reader2);

        agency.Notify("Design Patterns are awesome!");
    }
}

 

 وقتی خبر جدید منتشر می‌شود، همه‌ی Observerها مطلع می‌شوند.

مزایای استفاده از Design Patterns

  1. افزایش قابلیت استفاده مجدد (Reusability)

  2. تسهیل در نگهداری و توسعه‌ی کد

  3. بهبود خوانایی و استانداردسازی کد در تیم

  4. تسهیل ارتباط بین توسعه‌دهندگان از طریق نام‌های مشترک

 

اشتباه رایج

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

"Design Patterns ابزار هستند، نه هدف."

الگوها زمانی ارزشمندند که مسئله‌ای واقعی برای حل وجود داشته باشد.

 

جمع‌بندی

دستههدفمثال‌ها
Creationalنحوه‌ی ایجاد اشیاءSingleton, Factory, Builder
Structuralترکیب کلاس‌ها و اشیاءAdapter, Facade, Decorator
Behavioralتعامل بین اشیاءObserver, Strategy, Command

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

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