مشخصات مقاله
-
1698
-
0.0
-
9582
-
0
-
0
Design Patterns-الگوی Factory Method
Factory Method
Factory Method Pattern اما با کمی تفاوت، مشابه Simple factory pattern است. بر خلاف Simple factory، client ها دیگر کلاس factory را فراخوانی نمی کنند و به جای آن اینترفیس factory را صدا می زنند. اینترفیس factory بعداً، زمانی که ساخت
شی انجام شد، پیاده سازی می شود.
در صورتی که مقالات قبلی را مطالعه نکرده اید، از طریق لینک زیر قابل دسترس هستند:
چطور از Factory method pattern استفاده کنیم؟
با یک مثال ساده شروع می کنیم. فرض کنید client می خواهد قیمت برندهای مختلف ماشین را بداند. بنابراین یک اینترفیس به شکل زیر خواهیم داشت:
interface ICar
{
string GetOnRoadPrice(string model);
}و پیاده سازی concrete از ICar:
class Maruti : ICar
{
public string GetOnRoadPrice(string model)
{
//Logic to get OnRoadPrice based on model
if (model == "Alto 800 VXI")
{
return "3.4 Lakhs INR";
}
else
{
return "Information not available!";
}
}
}
class Hyundai : ICar
{
public string GetOnRoadPrice(string model)
{
//Logic to get OnRoadPrice based on model
if (model == "Grand i10 Magna 1.2 BSV")
{
return "5.4 Lakhs INR";
}
else
{
return "Information not available!";
}
}
}حالا به یک Factory Interface نیاز داریم که واسط بین لایه Bussiness و client باشد و اشیاء factory مورد نیاز را برای client فراهم کند.
interface ICarFactory
{
ICar GetCar();
}در ادامه پیاده سازی ICarFactory را مشاهده می کنید:
class MarutiFactory : ICarFactory
{
public ICar GetCar()
{
return new Maruti();
}
}
class HyundaiFactory : ICarFactory
{
public ICar GetCar()
{
return new Hyundai();
}
} حالا ببینیم client چگونه از تنظیمات ایجاد شده استفاده می کند:
//Client side
Console.Title = "Factory method pattern demo";
ICarFactory carFactory = null;
ICar car = null;
string model = null;
//Maruti
carFactory = new MarutiFactory();
car = carFactory.GetCar();
model = "Alto 800 VXI";
Console.WriteLine("On-road price for {0} car is: {1} ", model, car.GetOnRoadPrice(model)); خروجی:
//Hyundai
carFactory = new HyundaiFactory();
car = carFactory.GetCar();
model = "Grand i10 Magna 1.2 BSV";
Console.WriteLine("On-road price for {0} car is: {1} ", model, car.GetOnRoadPrice(model));خروجی:
نمودار کلاس:
همانطور که در کد فوق مشاهده کردید:
- Client، با ساخت یک نمونه از factory برند ماشین، شی factory مورد نیاز را بدست می آورد.
- سپس با فراخوانی متد GetCar از شی factory دریافت شده، شی مربوط به ماشین مورد نظر را دریافت میکند.
- Client با فراخوانی متد GetOnRoadPrice و ارسال نام مدل ماشین، می تواند قیمت ماشین را بدست آورد.
به طور خلاصه با استفاده از الگوی Factory Method به موارد زیر دست خواهیم یافت:
- Loose coupling بین لایه های business و client
- Client فقط از ICarFactory خبر دارد و هیچ اطلاعی از پیاده سازی آن ندارد.
- کلاس های Abstract شده از طرف Client (Maruti و Hyundai)