الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Factory را معرفی کنیم.
الگوی فکتوری (Factory) یک الگوی ایجاد کننده(Creational) است که یک رابط(Interface) بهمنظور ایجاد اشیاء برای یک کلاس پایه(Super Class) فراهم میکند، اما به کلاسهای مشتق شده اجازه میدهد تا نوع اشیائی که ایجاد میشوند را تغییر دهند. این الگو، ایجاد شئ را به کلاس های مشتق شده واگذار میکند.
الگوی فکتوری زمانی مفید است که برای ایجاد اشیاء به یک رابط مشترک نیاز باشد، اما کلاسهای واقعی ایجاد شده ممکن است متفاوت باشند. این الگو به خوبی کلاس ها و سازنده های آن ها را از هم جدا میکند و انعطاف پذیری بالایی را در ایجاد اشیاء بوجود میآورد.
الگوی فکتوری شامل اجراء زیر است:
در ادامه یک مثال از الگوی فکتوری به زبان سی شارپ آورده شده است:
// 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 برای ثبت لاگ در یک فایل یا یک پایگاه داده استفاده کنیم.
مطالعه این الگو تنها به منظور استفاده از آن نیست. این الگو در فریم ورک های مختلفی استفاده شده است که دانستن روش کار آن به ما در استفاده از این فریم ورک ها کمک میکند.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه