Factory Method
مقدمة:
Factor Method يستخدم عندما يعرف Object متى يأخذ نسخة من ال Parent Class لكنه لا يعرف بالضبط ماهو الكلاس المناسب من Subclasses الموجودة فى Parent Class, بجانب ذلك فإن ال Parent Class يخفى الألية الخاصة المطلوبة لعمل نسخه من تلك ال Class.
Factory Method Pattern هو طريقة لإنشاء Object, ولكن يترك ل Subclasses أن تقرر بالضبط أى Class سوف يأخذ منه ال Object نسخة.
Factory Method يعطى النسخة المناسبة من Subclasses لل Object بناءاً على معلومة يتزود بها عن طريق ال Client أو يستخلصها من الحاله الحالية للتطبيق Current State.
كل Class من Subclasses تعمل Override لل Methods الموجودة فى Parent Class لكى تقدم أنواع مختلفة من الوظائف لكل Method
إختيار الكلاس المناسب يعتمد على عوامل معينه على سبيل الميثال:
- The state of running application
- Application configuration Setting
- Expansion of requirements or enhancements.
UML Diagram
إضغط على الصورة للتكبير |
كما نلاحظ فإن فى UML Diagram فإننا نريد أن نأخذ نسخة من Product معين لكننا لا نعرف أى Product هو المناسب Product A أو Product B
سوف نجد أن هناك Interface يحتوى على Method وهذا ال Interface سوف نعمل له Implement داخل Product A و Product C وبالتالى كل Product سوف يحتوى على نفس ال Method ولكن كل Method لها وظيفة تختلف عن الأخرى
ونجد أيضأ أن هناك Class Creator من نفس نوع ال Interface هو اللى بيرجعلى Product المطلوب كما سوف يتضح فى الكود التالى:
الكود مختصر:
الكود بالكامل:
using System;
namespace ConsoleApplication2
{
public class Program
{
static void Main(string[] args)
{
MyCreator
c = new MyCreator();
IProduct
p;
for
(int i = 0; i <= 12; i++)
{
p = c.FactoryMethod(i);
Console.WriteLine(p.shipForm());
}
}
}
public interface IProduct
{
string
shipForm();
}
public class ProductA:IProduct
{
public string shipForm()
{
return
"Spain";
}
}
public class ProductB:IProduct
{
public string shipForm()
{
return
"South Africa";
}
}
public class DefaultProduct:IProduct
{
public string shipForm()
{
return
"Not Avaliable";
}
}
public class MyCreator
{
public IProduct FactoryMethod(int
month)
{
if
(month >=4 && month<=11)
{
return
new ProductA();
}
else
if (month==1 || month==2 ||month==12)
{
return
new ProductB();
}
else{
return new DefaultProduct();
}
}
}
}
1 التعليقات
يعطيك العافية شرح جميل وواضح لكن نريد امثلة اكثر على حالات لاستخدام هذا النوع من pattern
إرسال تعليق