قبلا و در این لینک به پیاده سازی الگوي طراحي Factory Method پرداخته شده است. قبل از ادامه پیشنهاد
می کنم آن را حتما مطالعه کنید.
الگوی Abstract Factory یک ابر کارخانه ای است که کارخانه های دیگر را ایجاد می کند. این الگو را کارخانه کارخانه ها نیز می نامند. در الگوی Abstract Factory یک اینترفیس مسئول ایجاد مجموعه ای از اشیاء مرتبط یا اشیاء وابسته بدون مشخص کردن کلاس های مشخص آنها است.
می توانیم بگوییم که فقط یک سازنده شی است که می تواند بیش از یک نوع شی ایجاد کند.
زمانی از آن استفاده می کنیم که نیاز به ایجاد مجموعه ای از اشیاء مرتبط یا اشیاء وابسته داشته باشیم. که باید با هم به عنوان خانواده ای از اشیاء مرتبط استفاده شوند.
اول از همه، هر دوی آنها در دسته Creational قرار می گیرند و به این معنی است که هر دو مشکل مربوط به ایجاد شی را حل می کنند.هر دو در مورد ایجاد اشیا هستند.
در الگوی طراحی Factory Method :
ما یک رابط تعریف می کنیم که متدی را نشان می دهد که برای ما اشیاء را ایجاد می کند. نوع برگشتی آن متد هرگز یک نوع مشخص نیست. بلکه یک اینترفیس یا ممکن است یک Abstract Class باشد.
اما در الگوی طراحی Abstract Factory :
در اینجا، ما یک رابط تعریف می کنیم که خانواده هایی از اشیاء مرتبط یا وابسته را ایجاد می کند. به عبارت ساده، رابط چندین متد را در معرض دید قرار می دهد که هر کدام از آنها شی ایجاد می کند. باز هم، در اینجا انواع بازگشتی متد، generic interfaceها خواهند بود.
این الگو در دل خود از factory method برای تولید یک شی استفاده می کند
وقتی الگوی Factory Method را مدلسازی کردیم، این کار را با استفاده از کارت های اعتباری انجام دادیم.
نکته ای که در مورد کارت های اعتباری وجود دارد این است که آنها صرف نظر از اینکه با چه میزان سقف اعتباری هستند (Silver ، Gold و Platinum) همچنان کارت اعتباری هستند، به عنوان مثال در اینجا مفهوم کارت اعتباری را می توان خانواده ای از اشیاء مرتبط در نظر گرفت. اما اگر بخواهیم چندین خانواده اشیاء را مدل کنیم، نه فقط یک خانواده، چی؟
بیایید بر اساس دیاگرام 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("Unknown Exchange CreditCard Type"); } } public IRialServicesFactory GetRialServices() { switch (_rialCreditCardType) { case RialCreditCardType.Silver_TYPE: return new RialSilverCardService(); case RialCreditCardType.Diamond_Type: return new RialDiamondCardService(); default: throw new NotSupportedException("Unknown Rial CreditCard Type"); } } }
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("Your card is " + this.GetType().Name + " & your credit limit is " + CreditLimit.ToString("C", CultureInfo.CreateSpecificCulture("en-US"))); } }
RialSilverCardService :
public class RialSilverCardService : IRialServicesFactory { protected double CreditLimit; public RialSilverCardService() { SetCreditLimit(); } public void SetCreditLimit() { // Implement some init logic here... CreditLimit = 30000000; Console.WriteLine("Your card is " + this.GetType().Name + " & your credit limit is " + CreditLimit.ToString("C", CultureInfo.CreateSpecificCulture("fa-IR"))); } }
و دیگر Product ها که در نمونه پروژه ضمیمه می توانید آنها را مشاهده کنید ....
5.Client :
Console.WriteLine("************** BankA ***********************"); ICreditCardBaseFactory baseFactory = new BankA(); baseFactory.GetExchangeServices(); baseFactory.GetRialServices(); Console.WriteLine("************** BankB ***********************"); 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 }
و در نهایت خروجی :
همانطور که دیدید در اینجا خانواده ای از اشیاء مرتبط به هم را ایجاد کردیم.
بیشتر بخوانید : پیاده سازی الگوي طراحي Factory Method
بیشتر بخوانید : Implementing DDD - Clean Architecture
بیشتر بخوانید : نقشه راه توسعه دهندگان Asp.NET Core