Mohsen Farokhi - محسن فرخی
Mohsen Farokhi - محسن فرخی
خواندن ۳ دقیقه·۵ سال پیش

الگوی Factory Method

در ادبیات الگوهای طراحی از واژه factory در سه حوزه استفاده می شود. زمانی که در مورد Simple Factory صحبت می کنیم، در مورد یک کلاس صحبت می کنیم که منطق ساخت یک object را encapsulate کرده است و آن را به ما برمی گرداند. موضوع دیگری که در design patternها مطرح می شود الگوی Factory Method است که در مسائل متفاوت تری استفاده می شود و به آن می پردازیم. و حوزه سوم Abstract Factory است که در آینده به آن می پردازیم.

الگوی Factory Method
الگوی Factory Method

در factory method دو جزء کلی به نام Creator و Product وجود دارد. اجزای ConcreteCreator و ConcreteProduct نیز وجود دارند که ConcreteProduct ممکن است الزاما وجود نداشته باشد.

در factory method، یک interface برای ساخت objectها داریم و وظیفه ساخت object را به subclassها واگذار می کنیم.
برای مثال، کلاس هایی به نام Application و Document داریم و به دنبال طراحی یک فریم ورک هستیم که تعدادی document را به کاربران نشان می دهد. در این مساله دو abstraction برای application و document در قالب abstract class خواهیم داشت.

کلاس application را به عنوان creator و document را به عنوان product در نظر بگیرید.

در انتزاعی که برای application در نظر می گیریم، تعدادی رفتار خواهیم داشت که به مدیریت documentها می پردازند.

public abstract class Application { public abstract Document CreateDocument(); public void NewDocument() { var doc = CreateDocument(); docs.Add(doc); doc.Open(); } } public class DrawingApplication : Application { public override Document CreateDocument() { return new DrawingDocument(); } } public abstract class Document { } public class DrawingDocument : Document { }

بنابراین دانش ساخت object از فریم ورک خارج می شود و به subclassها واگذار می شود.

در تصویر بالا یک Application وجود دارد که یک abstract method به نام CreateDocument دارد و توسط MyApplication به عنوان یک subclass پیاده سازی می شود. application در جایی تصمیم می گیرد document را ایجاد کند و subclassها می دانند چه پیاده سازی باید انجام دهند.

متد CreateDocument در اینجا به عنوان یک factory method است. به این صورت که یک متد در نقش سازنده است که جاهای دیگر بر اساس منطق خود از آن استفاده می کنیم و با در نظر گرفتن یک subclass، مشخص می کنم که document چه چیزی است.

تفاوت آن با Simple Factory این است که در simple factory موضوع ساخت یک object، منطق خاصی را دنبال می کند و وارد کردن این منطق در کلاس های دیگر باعث تکرار و کثیف شدن کد می شود. اما در factory method هماهنطور که مشاهده کردید مساله دیگری بود.

این تعریف از factory method یک ارتباط نزدیک با پترن template method دارد. یک دسته از متدهایی که در template method داریم، factory methodها می باشند.

زمانی که ما نیاز داریم درگیر یک product باشیم و نیازی نداریم که نوع product را شناسایی کنیم، می توانیم وابستگی کد خود را از ساختار application-specific جدا کنیم. client یک ساختار از creator می گیرد و پیاده سازی خود را ارائه می دهد.


به طور خلاصه، یک interface برای ساخت object تعریف می شود، اما ساخت آن به subclassها واگذار می شود. با این هدف که آن ها representationهای متفاوتی را درست می کنند. بنابراین در این الگو representationهای متفاوت را به عنوان variability در نظر می گیریم و اینترفیسی که برای ساخت تعریف می شود و همچنین زمان ساخت، commonality می باشند.

الگوی Factory Methoddesign patternsالگوهای طراحیمحسن فرخیFactory Method
شاید از این پست‌ها خوشتان بیاید