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 التعليقات

غير معرف يقول... @ 6 مايو 2014 في 11:15 م

يعطيك العافية شرح جميل وواضح لكن نريد امثلة اكثر على حالات لاستخدام هذا النوع من pattern

إرسال تعليق