
الگوی طراحـــــــــی Factory Method
الگوی طراحی Factory Method یکی از الگوهای ایجادی (Creational Patterns) است که برای ایجاد شیء به صورت پلیمورفیک استفاده میشود. این الگو به کلاینت (کدی که شیءها را میسازد) اجازه میدهد تا روشی را برای ایجاد شیء تعریف کند، اما نحوهی ایجاد دقیق آن را به زیرکلاسها (Subclasses) میسپارد. بنابراین، ما میتوانیم از این الگو برای ایجاد شیء با توجه به نوع مورد نیاز در زمان اجرا استفاده کنیم.
فرض کنید ما یک برنامه داریم که قالبهای مختلفی از اسناد را میسازد. این اسناد میتوانند شامل فایلهای متنی، فایلهای PDF و فایلهای HTML باشند. با استفاده از الگوی Factory Method، میتوانیم ایجاد شیء اسناد را به زیرکلاسها (بر اساس نوع مورد نیاز) میسپاریم تا به انعطافپذیری و قابلیت توسعه بیشتری دست یابیم.
حالا با یک مثال واقعی و بسیار کاربردی از الگوی Factory Method در زبان سی شارپ آشنا میشویم:
1. Product (محصول اسناد):
1public interface IDocument
2{
3 void Open();
4 void Save();
5}
6
7public class TextDocument : IDocument
8{
9 public void Open()
10 {
11 Console.WriteLine("Opening a text document.");
12 }
13
14 public void Save()
15 {
16 Console.WriteLine("Saving a text document.");
17 }
18}
19
20public class PdfDocument : IDocument
21{
22 public void Open()
23 {
24 Console.WriteLine("Opening a PDF document.");
25 }
26
27 public void Save()
28 {
29 Console.WriteLine("Saving a PDF document.");
30 }
31}
32
33public class HtmlDocument : IDocument
34{
35 public void Open()
36 {
37 Console.WriteLine("Opening an HTML document.");
38 }
39
40 public void Save()
41 {
42 Console.WriteLine("Saving an HTML document.");
43 }
44}
2. Creator (سازنده اسناد):
1public abstract class DocumentCreator
2{
3 public abstract IDocument CreateDocument();
4
5 public void ProcessDocument()
6 {
7 IDocument document = CreateDocument();
8 document.Open();
9 document.Save();
10 }
11}
12
13public class TextDocumentCreator : DocumentCreator
14{
15 public override IDocument CreateDocument()
16 {
17 return new TextDocument();
18 }
19}
20
21public class PdfDocumentCreator : DocumentCreator
22{
23 public override IDocument CreateDocument()
24 {
25 return new PdfDocument();
26 }
27}
28
29public class HtmlDocumentCreator : DocumentCreator
30{
31 public override IDocument CreateDocument()
32 {
33 return new HtmlDocument();
34 }
35}
3. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 DocumentCreator creator = new TextDocumentCreator();
6 creator.ProcessDocument();
7
8 creator = new PdfDocumentCreator();
9 creator.ProcessDocument();
10
11 creator = new HtmlDocumentCreator();
12 creator.ProcessDocument();
13 }
14}
خروجی برنامه به صورت زیر خواهد بود:
Opening a text document.
Saving a text document.
Opening a PDF document.
Saving a PDF document.
Opening an HTML document.
Saving an HTML document.
در این مثال، با استفاده از الگوی Factory Method، ما یک برنامه ساخت اسناد را ایجاد کردیم. کلاسهای TextDocumentCreator، PdfDocumentCreator و HtmlDocumentCreator هرکدام از زیرکلاسهای کلاس DocumentCreator بوده و متد ()CreateDocument را به صورت مخصوص خود پیادهسازی کردهاند. سپس با استفاده از کلاس Client، ما میتوانیم به راحتی اسناد مختلفی با استفاده از متدهای ()ProcessDocument و ()CreateDocument ایجاد کنیم.
این الگو به ما این امکان را میدهد که کد ایجاد شیء را از جزئیات پنهان کنیم و به جای آن، از یک سازنده کلی استفاده کنیم تا شیء مناسب را بر اساس نیازها ایجاد کند. این رویکرد از جدا کردن مسئولیتها و اصول مهم طراحی را به پروژههای ما اعمال میکند.