معرفی الگوی طراحی Factory

معرفی الگوی طراحی Factory

مدت مطالعه : 4 دقیقه

27 اسفند 1401

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

الگوی فکتوری (Factory) یک الگوی ایجاد کننده(Creational) است که یک رابط(Interface) به‌منظور ایجاد اشیاء برای یک کلاس پایه(Super Class) فراهم می‌کند، اما به کلاس‌های مشتق شده اجازه می‌دهد تا نوع اشیائی که ایجاد می‌شوند را تغییر دهند. این الگو، ایجاد شئ را به کلاس های مشتق شده واگذار می‌کند. 

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

الگوی طراحی فکتوری

الگوی فکتوری شامل اجراء زیر است: 

  • Creator: یک کلاس پایه(Super Class) انتزاعی شامل متد اصلی ایجاد شئ است. همچنین ممکن است حاوی کدی برای عملکرد مشترک برای اشیاء ایجاد شده باشد.
  • ConcreteCreator: این یک زیر کلاس(Sub Class) از Creator است که متد ایجاد اشیا را پیاده سازی می کند و یک نمونه جدید از کلاس موردنظر بر‌می‌گرداند.
  • Product: یک کلاس انتزاعی یا یک رابط(Interface) برای اشیاء ایجاد شده است. مقدار بازگشتی از متد ایجاد شئ، از این نوع است.
  • ConcreteProduct: یک کلاس مشتق شده از Product که حاوی رفتار مخصوص به خود است. در متد ایجاد شئ، از این کلاس نمونه ایجاد می‌شود.

 

در ادامه یک مثال از الگوی فکتوری به زبان سی شارپ آورده شده است:

// Product interface
public interface ILogger
{
    void Log(string message);
}
// Concrete product classes
public class FileLogger : ILogger
{
    public void Log(string message)
    {
        // Code to log message to a file
    }
}
public class DatabaseLogger : ILogger
{
    public void Log(string message)
    {
        // Code to log message to a database
    }
}
// Creator abstract class
public abstract class LoggerFactory
{
    public abstract ILogger CreateLogger();
}
// Concrete creator classes
public class FileLoggerFactory : LoggerFactory
{
    public override ILogger CreateLogger()
    {
        return new FileLogger();
    }
}
public class DatabaseLoggerFactory : LoggerFactory
{
    public override ILogger CreateLogger()
    {
        return new DatabaseLogger();
    }
}
// Usage code
class Program
{
    static void Main(string[] args)
    {
        // Use the factory method to create a logger
        LoggerFactory loggerFactory = new FileLoggerFactory();
        ILogger logger = loggerFactory.CreateLogger();
        logger.Log("Log message");
        loggerFactory = new DatabaseLoggerFactory();
        logger = loggerFactory.CreateLogger();
        logger.Log("Log message");
    }
}

در این مثال، ما یک رابط ILogger داریم که امضاء متد لاگ زدن را تعریف می کند. سپس دو کلاس مرتبط داریم که این رابط را پیاده سازی می کنند: FileLogger  و DatabaseLogger

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

 کلاس های FileLoggerFactory و DatabaseLoggerFactory کلاس هایی هستند که از کلاس اصلی LoggerFactory ارث بری می‌کنند و متد CreateLogger را پیاده سازی می‌کنند. هرکدام از این سازنده ها، اشیاء خاص خود را ایجاد کرده و آن را بر می‌گردانند.

سپس در تابع Main از همه کلاس های ایجاد شده استفاده می‌کنیم. ابتدا یک شی LoggerFactory ایجاد کرده و از متد CreateLogger آن برای ایجاد یک شی ILogger استفاده می کنیم. بدون توجه به اینکه از کدام یک از مشتقات LoggerFactory برای ایجاد شی ILogger استفاده می کنیم، می توانیم از شی ILogger  برای ثبت لاگ در یک فایل یا یک پایگاه داده استفاده کنیم.

 

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

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

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

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

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه