سلام به شما دوستان گرامی عزیز ،حالتون چطوره؟ خوب هستید؟ امیدوارم که شاد وسلامت با اموزش امروزما که درمورد Abstract Factory  است همراه بمانید .در این مقاله به نوع دیگری از Factory design pattern می پردازیم به نام Abstract Factory. اجازه دهید قبل از پرداختن به بحث پیاده سازی، هدف از abstract factory pattern را توضیح دهیم.

در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق تاپیک های زیر قابل دسترس هستند:

·       Design Patterns

·       Singleton Pattern

·       Simple Factory Pattern

درواقع Abstract factory pattern مرحله بعد از Simple Factory pattern است که در آن Factoryهای مرتبط به هم و یا کلاس های هم خانواده را مشخص می کنیم.

برای درک بهتر، مثال قبل را در مقاله Simple Factory pattern به خاطر بیاورید. در Simple Factory Pattern، ما تمام برندهای ماشین ها را با یک interface مدیریت کردیم. فرض کنید مصرف کننده یا client ماشین، با انتخاب برند ماشین، وارد مرحله جدیری از طبقه بندی شود.

در چنین مواقعی با Abstract Family سرو کار خواهیم داشت. این pattern خانواده ای از کلاس ها یا factoryهای مرتبط ایجاد میکند تا پاسخگوی نیاز ما باشد.
چطور از Abstract Factory Pattern استفاده کنم؟

فرض کنید client می خواهد جزئیات ماشین برند های مختلف را بداند. این جزئیات عبارتند از هزینه و حق بیمه مدل ها. پس باید یک Abstract product Interface به شکل زیر تعریف کنیم:

interface IEconomy

{

string ShowEconomy();

}

interface IPremium

{

string ShowPremium();

}

چون می خواهیم جزئیات ماشین را با توجه به برند ماشین نشان دهیم، باید یکسری کلاس های واقعی بسازیم که از Interface فوق استفاده کنند.

class Alto : IEconomy

{

public string ShowEconomy()

{

return “Alto”;

}

}

class SCross : IPremium

{

public string ShowPremium()

{

return “S-Cross”;

}

}

class Eon : IEconomy

{

public string ShowEconomy()

{

return “Eon”;

}

}

class Elantra : IPremium

{

public string ShowPremium()

{

return “Elantra”;

}

}

حالا باید یک اینترفیس abstract factory بسازیم که اینترفیس های abstract product، را که برای تعریف جزئیات ماشین ایجاد شده اند، تطبیق دهد.

interface ICarFactory

{

IEconomy GetEconomy();

IPremium GetPremium();

}

حالا وقت آن رسیده است که یک خانواده از کلاس های واقعی بسازیم تا از brandهای مختلف پشتیبانی کند. قطعاً این کار با پیاده سازی ICarFactory انجام می شود:

class MarutiFactory : ICarFactory

{

public IEconomy GetEconomy()

{

return new Alto();

}

public IPremium GetPremium()

{

return new SCross();

}

}

class HyundaiFactory : ICarFactory

{

public IEconomy GetEconomy()

{

return new Eon();

}

public IPremium GetPremium()

{

return new Elantra();

}

}

حالا به جایی رسیده ایم که می توانیم از تنظیماتی که قبلاً ایجاد کرده ایم، استفاده کنیم:

Console.Title = “Abstract Factory pattern demo”;

ICarFactory carFactory = null;

IEconomy economy = null;

IPremium premium = null;

//Maruti

carFactory = new MarutiFactory();

economy = carFactory.GetEconomy();

premium = carFactory.GetPremium();

Console.WriteLine(“Normal car is: ” + economy.ShowEconomy() + “\nPremium Car is: ” + premium.ShowPremium());

خروجی:

آموزشگاه برنامه نویسی تحلیل داده

//Hyundai

carFactory = new HyundaiFactory();

economy = carFactory.GetEconomy();

premium = carFactory.GetPremium();

Console.WriteLine(“Normal car is: ” + economy.ShowEconomy() + “\nPremium Car is: ” + premium.ShowPremium());

خروجی:

آموزشگاه برنامه نویسی تحلیل داده

نمودار کلاس:

آموزشگاه برنامه نویسی تحلیل داده

همانطور که در کد فوق مشاهده می کنید client، شی car factory مورد نیاز را با ساخت یک نمونه از برند Car factory مرتبط، دریافت میکند و سپس شی اینترفیس مورد نیاز را با فراخوانی متد car factory مرتبط ، دریافت می کند تا بعداً بتواند متدهای product interface ، نظیر ShowEconomy و ShowPremium، را فراخوانی کند.