الگوی طراحی
Design Pattern راهحلهای سطح پایین مربوط به پیادهسازی و مشکلات شیگرای رایج را ارائه میکند. در واقع، پیاده سازی خاصی را برای مشکل برنامه نویسی شی گرا خاص پیشنهاد می کند.الگوهای طراحی توسط دیگران آزمایش شده اند و پیروی از آنها توصیه می شود، به عبارت دیگر الگو یک راه حل کلی قابل استفاده مجدد برای یک مشکل رایج در یک زمینه معین در طراحی نرم افزار است.
قبل از یادگیری الگوی Factory Method، بياييد کوتاه در مورد "Gang of Four (GoF)" که الگوی Factory Method به آن تعلق دارد، صحبت کنيم.
در واقع Gang of Four (GoF) چهار نویسنده کتاب «Design Patterns: Elements of Reusable Object-Oriented Software» هستند. این کتاب مهم علاوه بر ارائه 23 الگوی طراحی برنامه نویسی شی گرا، تکنیک ها و مشکلات توسعه مختلفي را تشریح می کند. این چهار نویسنده عبارتند از :
Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.
الگوی Factory Method به عنوان یک الگوی creational طبقه بندی می شود.(الگوهایی با هدف ساخت object که خلق اشیاء جدید را انتزاعی می کنند)
اشیا می توانند اشیاء دیگر را مستقیماً با فراخوانی کلمه کلیدی new نمونه سازی کنند، اما این رویکرد اغلب بهترین انتخاب نیست.
نمونهسازی شی یک مسئولیت جداگانه است که باید از client code به کلاسها/متدهای مجزا به نام factory منتقل شود.
الگوی طراحی Factory Method یک interface يا يک abstract class را برای ایجاد یک object فراهم می کند، اما اجازه می دهد sub classeها تصمیم بگیرند که کدام کلاس را نمونه سازی کنند. این الگو به یک کلاس اجازه می دهد تا نمونه سازی را به زیر کلاس ها موکول کند.( به جای تعریف هر شی به صورت دستی، توسعه دهندگان می توانند آن را به صورت programmatically انجام دهند.)
به طور خلاصه، Factory به شیئی گفته می شود که بدون استفاده از constructor اشیاء را ایجاد می کند.
فرض کنيد که کلاسها «مردم» هستند، و الگوها روشهایی هستند که مردم با یکدیگر صحبت میکنند.
برای درک راحتتر، فرض کنید یک مغازه حاوی محصولات متنوعی است و مغازهدار بر اساس نیازهای ما، چیزهایی را که نیاز داریم به ما تحویل میدهد. به همین ترتیب، الگوی Factory کار می کند. به طور معمول، ما پارامترها را ارسال می کنیم. متد Factory ما تعیین میکند که کدام کلاس باید بر اساس پارامتری که پاس دادهایم نمونهسازی شود، و نمونهای از آن کلاس خاص ایجاد و ارائه میکند.
به همین ترتیب، استفاده از Factory به مصرفکننده اجازه میدهد تا اشیاء جدید را بدون نیاز به دانستن جزئیات نحوه ایجاد یا وابستگیهای آنها ایجاد کند.
کلاسهای Factory اغلب پياده سازي میشوند زیرا به پروژه اجازه میدهد تا اصول SOLID را دقیقتر دنبال کند. به طور خاص، جداسازی interface و اصل dependency inversion.
در واقع Factoryها و interface ها
هنگامی که روی یکی از این نوع برنامه ها کار کردید، دیگر نمی خواهید به استفاده از کلمه کلیدی new برگردید.
فرض کنید یک بانک کارت های اعتباری را به مشتریان خود ارائه می دهد. آنها 3 نوع کارت اعتباری مانند کارت های Silver ، Gold و Platinum ارائه می دهند. هر نوع کارت دارای محدودیت اعتباری متفاوتی است به عنوان مثال:
برای مثال: اگر حقوق شما 4200$ است، می توانید کارت طلایی دریافت کنید.
مواردی که باید در نظر داشته باشید:
بیایید بر اساس آنچه کمي بالاتر گفته شد کد را پیاده سازی کنیم تا ببینیم الگوی طراحی Factory Method چگونه کار می کند.
اينجا کلاس انتزاعی والد برای همه زیر کلاس ها وجود دارد:
public abstract class CardType { protected double CreditLimit; public abstract void setCreditLimit(); public override string ToString() { return "Your card is " + this.GetType().Name + " & your credit limit is " + CreditLimit; } }
قطعه کد زیر کلاس 1:
public class SilverCard : CardType { public SilverCard() { setCreditLimit(); } public override void setCreditLimit() { CreditLimit = 10000; } }
قطعه کد زیر کلاس 2:
public class GoldCard : CardType { public GoldCard() { setCreditLimit(); } public override void setCreditLimit() { CreditLimit = 25000; } }
قطعه کد زیر کلاس 3:
public class PlatinumCard : CardType { public PlatinumCard() { setCreditLimit(); } public override void setCreditLimit() { CreditLimit = 50000; } }
در بالا زیر کلاس هایی وجود دارند که از همان کلاس والد گسترش می یابند.
کلاس Factory که حاوی متد Factory است در زیر نشان داده شده است.
public class Factory { public static CardType Getcard(String type) { switch (type) { case "Silver": return new SilverCard(); case "Gold": return new GoldCard(); case "Platinum": return new PlatinumCard(); default: return null; } } }
این متد Factory مسئول تعیین کلاسی است که نمونه سازی شود. این متد یک نمونه از کلاس مناسب را بر اساس پارامتری که به آن ارائه می دهیم ایجاد و برمی گرداند.
در زیر کلاس اصلی است:
String cardtype = "" Console.WriteLine("Enter your salary :"); double salary = Convert.ToDouble(Console.ReadLine()); if ((salary < 1000)) { cardtype = "Silver" } else if ((salary < 500000 && salary > 10000)) { cardtype = "Gold" } else { cardtype = "Platinum" } CardType mycard = Factory.Getcard(cardtype); Console.WriteLine(mycard);
در نتیجه، میتوانیم از الگوی طراحی Factory برای بازیابی اشیاء مختلف از کلاسهای مختلف بر اساس پارامتر خود استفاده کنیم. الگوی Factory تصمیم میگیرد که کدام کلاس را بدون نمایش جزئیات پیادهسازی براي client، نمونهسازی کند.
نکته Client : در اينجا کلاس Program.cs یا کلاس استفاده کننده مي باشد.
انواع مختلفی از الگوی Factory وجود دارد که هر کدام مشکل متفاوتی را حل می کند.
بیشتر بخوانید : پیاده سازی الگوی طراحی Abstract Factory
بیشتر بخوانید : Implementing DDD - Clean Architecture
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core