فرشید عزیزی
فرشید عزیزی
خواندن ۸ دقیقه·۳ سال پیش

پیاده سازی الگوي طراحي Factory Method

الگوی طراحی
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 Method

فرض کنيد که کلاس‌ها «مردم» هستند، و الگوها روش‌هایی هستند که مردم با یکدیگر صحبت می‌کنند.

برای درک راحت‌تر، فرض کنید یک مغازه حاوی محصولات متنوعی است و مغازه‌دار بر اساس نیازهای ما، چیزهایی را که نیاز داریم به ما تحویل می‌دهد. به همین ترتیب، الگوی Factory کار می کند. به طور معمول، ما پارامترها را ارسال می کنیم. متد Factory ما تعیین می‌کند که کدام کلاس باید بر اساس پارامتری که پاس داده‌ایم نمونه‌سازی شود، و نمونه‌ای از آن کلاس خاص ایجاد و ارائه می‌کند.

به همین ترتیب، استفاده از Factory به مصرف‌کننده اجازه می‌دهد تا اشیاء جدید را بدون نیاز به دانستن جزئیات نحوه ایجاد یا وابستگی‌های آنها ایجاد کند.

کلاس‌های Factory اغلب پياده سازي می‌شوند زیرا به پروژه اجازه می‌دهد تا اصول SOLID را دقیق‌تر دنبال کند. به طور خاص، جداسازی interface و اصل dependency inversion.

در واقع Factoryها و interface ها

  • اجازه می دهد تا طراحی جدا شده تر - و بنابراین قابل تست تر باشد.
  • این به شما امکان می دهد یک Inversion of Control (IoC) container را به راحتی معرفی کنید
  • هنگامی که زمان تغییر برنامه فرا می رسد، انعطاف پذیری بسیار بیشتری به شما می دهد (یعنی می توانید پیاده سازی های جدیدی را بدون تغییر کد وابسته ایجاد کنید)
  • کد client یک مسئولیت کمتر دارد زیرا نیازی به ایجاد اشیاء ندارد. این به عهده Factory است.
  • و Factory منطق ایجاد یک شی را در بر می گیرد که می تواند توسط بسیاری از clientها دوباره استفاده شود.

هنگامی که روی یکی از این نوع برنامه ها کار کردید، دیگر نمی خواهید به استفاده از کلمه کلیدی new برگردید.


نحوه پیاده سازی Factory Pattern

فرض کنید یک بانک کارت های اعتباری را به مشتریان خود ارائه می دهد. آنها 3 نوع کارت اعتباری مانند کارت های Silver ، Gold و Platinum ارائه می دهند. هر نوع کارت دارای محدودیت اعتباری متفاوتی است به عنوان مثال:

  • سقف اعتبار کارت نقره 10,000 دلار،
  • سقف اعتبار کارت طلایی 25,000 دلار
  • سقف اعتبار کارت پلاتینیوم 50,000 دلار است.

    نوع کارتی که مشتری دریافت می کند به حقوق ماهیانه او بستگی دارد.
  • کارت نقره ای برای هر کسی با حقوق ماهانه کمتر از 1000$ در دسترس است.
  • اگر درآمد ماهانه او بيشتر از 2,500$ باشد می تواند کارت طلایی دریافت کند.
  • در صورتی که حقوق ماهانه او از 5000$ بیشتر شود، واجد شرایط دریافت کارت پلاتینیوم است.

برای مثال: اگر حقوق شما 4200$ است، می توانید کارت طلایی دریافت کنید.

مواردی که باید در نظر داشته باشید:

  • همه زیر کلاس‌ها مانند: GoldCard، SilverCard و غیره باید همان کلاس والد را گسترش دهند، در اينجا CardType.
  • یک متد Factory را در کلاس Factory تعریف کنید. نوع برگشتی متد باید کلاس والد باشد. در اينجا CardType
  • به sub classeها اجازه دهید تا یک شی را بر اساس پارامتر ارسال شده به Factory Method ایجاد کنند.


بیایید بر اساس آنچه کمي بالاتر گفته شد کد را پیاده سازی کنیم تا ببینیم الگوی طراحی Factory Method چگونه کار می کند.

اينجا کلاس انتزاعی والد برای همه زیر کلاس ها وجود دارد:

public abstract class CardType { protected double CreditLimit; public abstract void setCreditLimit(); public override string ToString() { return &quotYour card is &quot + this.GetType().Name + &quot & your credit limit is &quot + 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 &quotSilver&quot: return new SilverCard(); case &quotGold&quot: return new GoldCard(); case &quotPlatinum&quot: return new PlatinumCard(); default: return null; } } }

این متد Factory مسئول تعیین کلاسی است که نمونه سازی شود. این متد یک نمونه از کلاس مناسب را بر اساس پارامتری که به آن ارائه می دهیم ایجاد و برمی گرداند.

در زیر کلاس اصلی است:

String cardtype = &quot&quot Console.WriteLine(&quotEnter your salary :&quot); double salary = Convert.ToDouble(Console.ReadLine()); if ((salary < 1000)) { cardtype = &quotSilver&quot } else if ((salary < 500000 && salary > 10000)) { cardtype = &quotGold&quot } else { cardtype = &quotPlatinum&quot } CardType mycard = Factory.Getcard(cardtype); Console.WriteLine(mycard);

در نتیجه، می‌توانیم از الگوی طراحی Factory برای بازیابی اشیاء مختلف از کلاس‌های مختلف بر اساس پارامتر خود استفاده کنیم. الگوی Factory تصمیم می‌گیرد که کدام کلاس را بدون نمایش جزئیات پیاده‌سازی براي client، نمونه‌سازی کند.

نکته Client : در اينجا کلاس Program.cs یا کلاس استفاده کننده مي باشد.

مشاهده پروژه در GitHub

انواع مختلفی از الگوی Factory وجود دارد که هر کدام مشکل متفاوتی را حل می کند.


بیشتر بخوانید : پیاده سازی الگوی طراحی Abstract Factory

بیشتر بخوانید : Implementing DDD - Clean Architecture

بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core

https://zarinp.al/farshidazizi

Factory Methoddesign patternasp net coreالگوی طراحی
Software Engineer
شاید از این پست‌ها خوشتان بیاید