کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

Design Patterns-الگوی Abstract Factory

Abstract Factory

در این مقاله به نوع دیگری از Factory design pattern می پردازیم به نام Abstract Factory. اجازه دهید قبل از پرداختن به بحث پیاده سازی، هدف از abstract 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());

خروجی:


آموزش Entity FrameWork 

به همراه Design Pattern
//Hyundai 

carFactory = new HyundaiFactory();

economy = carFactory.GetEconomy();

premium = carFactory.GetPremium();

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

خروجی:


آموزش Entity FrameWork 

به همراه Design Pattern

نمودار کلاس:


آموزش Entity FrameWork 

به همراه Design Pattern

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


1395/02/05 9119 1843
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...