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

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

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

الگوی Abstract Factory یک ابر کارخانه ای است که کارخانه های دیگر را ایجاد می کند. این الگو را کارخانه کارخانه ها نیز می نامند. در الگوی Abstract Factory یک اینترفیس مسئول ایجاد مجموعه ای از اشیاء مرتبط یا اشیاء وابسته بدون مشخص کردن کلاس های مشخص آنها است.

می توانیم بگوییم که فقط یک سازنده شی است که می تواند بیش از یک نوع شی ایجاد کند.

زمانی از آن استفاده می کنیم که نیاز به ایجاد مجموعه ای از اشیاء مرتبط یا اشیاء وابسته داشته باشیم. که باید با هم به عنوان خانواده ای از اشیاء مرتبط استفاده شوند.


اما این الگو چه تفاوتی با Factory Method دارد؟

اول از همه، هر دوی آنها در دسته Creational قرار می گیرند و به این معنی است که هر دو مشکل مربوط به ایجاد شی را حل می کنند.هر دو در مورد ایجاد اشیا هستند.

در الگوی طراحی Factory Method :

دیاگرام UML الگوی Factory Method
دیاگرام UML الگوی Factory Method

ما یک رابط تعریف می کنیم که متدی را نشان می دهد که برای ما اشیاء را ایجاد می کند. نوع برگشتی آن متد هرگز یک نوع مشخص نیست. بلکه یک اینترفیس یا ممکن است یک Abstract Class باشد.

  • شیء را از طریق وراثت ایجاد می کند.
  • هر بار فقط یک شی را تولید می کند.

اما در الگوی طراحی Abstract Factory :

دیاگرام UML الگوی Abstract Factory
دیاگرام UML الگوی Abstract Factory

در اینجا، ما یک رابط تعریف می کنیم که خانواده هایی از اشیاء مرتبط یا وابسته را ایجاد می کند. به عبارت ساده، رابط چندین متد را در معرض دید قرار می دهد که هر کدام از آنها شی ایجاد می کند. باز هم، در اینجا انواع بازگشتی متد، generic interfaceها خواهند بود.

  • شیء را از طریق ترکیب(composition) ایجاد می کند.
  • خانواده هایی از اشیاء مرتبط یا وابسته را تولید می کند.
این الگو در دل خود از factory method برای تولید یک شی استفاده می کند

وقتی الگوی Factory Method را مدلسازی کردیم، این کار را با استفاده از کارت های اعتباری انجام دادیم.

نکته ای که در مورد کارت های اعتباری وجود دارد این است که آنها صرف نظر از اینکه با چه میزان سقف اعتباری هستند (Silver ، Gold و Platinum) همچنان کارت اعتباری هستند، به عنوان مثال در اینجا مفهوم کارت اعتباری را می توان خانواده ای از اشیاء مرتبط در نظر گرفت. اما اگر بخواهیم چندین خانواده اشیاء را مدل کنیم، نه فقط یک خانواده، چی؟

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

بیایید بر اساس دیاگرام UML الگوی Abstract Factory پیش برویم.

1. Abstract Factory:

فرض کنید ما در سیستم بانکی، شعبی داریم که خدمات ارزی و ریالی ارائه می دهند و برای مثال یکی از این خدمات در حوزه کارت اعتباری می باشد

public interface ICreditCardBaseFactory { IExchangeServices GetExchangeServices(); IRialServices GetRialServices(); }

2. Concrete Factory:

BankA :

public class BankA : ICreditCardBaseFactory { public IExchangeServicesFactory GetExchangeServices() { return new ExchangeSilverCardService(); } public IRialServicesFactory GetRialServices() { return new RialSilverCardService(); } }

BankB :

public class BankB : ICreditCardBaseFactory { private ExchangeCreditCardType _exchangeCreditCardType; private RialCreditCardType _rialCreditCardType; public BankB(ExchangeCreditCardType exchangeCreditCardType, RialCreditCardType rialCreditCardType) { _exchangeCreditCardType = exchangeCreditCardType; _rialCreditCardType = rialCreditCardType; } public IExchangeServicesFactory GetExchangeServices() { switch (_exchangeCreditCardType) { case ExchangeCreditCardType.Silver_TYPE: return new ExchangeSilverCardService(); case ExchangeCreditCardType.Gold_TYPE: return new ExchangeGoldCardService(); case ExchangeCreditCardType.Platinum_Type: return new ExchangePlatinumCardService(); default: throw new NotSupportedException(&quotUnknown Exchange CreditCard Type&quot); } } public IRialServicesFactory GetRialServices() { switch (_rialCreditCardType) { case RialCreditCardType.Silver_TYPE: return new RialSilverCardService(); case RialCreditCardType.Diamond_Type: return new RialDiamondCardService(); default: throw new NotSupportedException(&quotUnknown Rial CreditCard Type&quot); } } }

3.AbstractProduct :

IExchangeServicesFactory :

public interface IExchangeServicesFactory { void SetCreditLimit(); }

IRialServicesFactory :

public interface IRialServicesFactory { void SetCreditLimit(); }

4.Product

ExchangeSilverCardService :

public class ExchangeSilverCardService : IExchangeServicesFactory { protected double CreditLimit; public ExchangeSilverCardService() { SetCreditLimit(); } public void SetCreditLimit() { // Implement some init logic here... CreditLimit = 1000; Console.WriteLine(&quotYour card is &quot + this.GetType().Name + &quot & your credit limit is &quot + CreditLimit.ToString(&quotC&quot, CultureInfo.CreateSpecificCulture(&quoten-US&quot))); } }

RialSilverCardService :

public class RialSilverCardService : IRialServicesFactory { protected double CreditLimit; public RialSilverCardService() { SetCreditLimit(); } public void SetCreditLimit() { // Implement some init logic here... CreditLimit = 30000000; Console.WriteLine(&quotYour card is &quot + this.GetType().Name + &quot & your credit limit is &quot + CreditLimit.ToString(&quotC&quot, CultureInfo.CreateSpecificCulture(&quotfa-IR&quot))); } }

و دیگر Product ها که در نمونه پروژه ضمیمه می توانید آنها را مشاهده کنید ....

5.Client :

Console.WriteLine(&quot************** BankA ***********************&quot); ICreditCardBaseFactory baseFactory = new BankA(); baseFactory.GetExchangeServices(); baseFactory.GetRialServices(); Console.WriteLine(&quot************** BankB ***********************&quot); baseFactory = new BankB(ExchangeCreditCardType.Gold_TYPE, RialCreditCardType.Diamond_Type); baseFactory.GetExchangeServices(); baseFactory.GetRialServices(); Console.ReadKey(); public enum ExchangeCreditCardType { Silver_TYPE, Gold_TYPE, Platinum_Type } public enum RialCreditCardType { Silver_TYPE, Diamond_Type }

و در نهایت خروجی :

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

همانطور که دیدید در اینجا خانواده ای از اشیاء مرتبط به هم را ایجاد کردیم.


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

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

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

https://zarinp.al/farshidazizi

Abstract Factorydesign patternasp net core
Software Engineer
شاید از این پست‌ها خوشتان بیاید