النمط الثاني:نمط المصنع Factory

هذا النمط بسيط جداً مفيد جداً في بناء المكتبات البرمجية
المشكلة التي يحلها:
أن يكون لديك أكثر من فئة تقوم ببناء فئة معينة
ولا تريد أن يحدث لبس في عملية بناء الكائنات
أو تريد التسهيل على مستخدميك
مثال:لو فرضنا يوجد لدينا واجهة لطابور Queue
ولدينا نوعين من الطوابير طابور مبني بواسطة مصفوفة ArrayQueue
و طابور مبني بواسطة الحلقات الثنائية LinkedListQueue
ويوجد لدينا مستخدم لا يعرف الفرق بين الاثنين فرضاً
طريقة الاستخدام:
نقوم ببناء فئة جديدة نسميها InterfaceFactory
هذه الفئة تحتوي دالة اسمها createInterface وتأخذ parameter
يسهل على المستخدم أن يفرق به بين فئة وأخرى ممن يرثون هذه الواجهة
(بالطبع كلمة Interface سيتم استبدالها بمثالنا بطابور Queue)
نعود إلى مثالنا سنفترض أنك ستفرق بين النوعين على أساس
هل هناك طول معين للطابور
هذا المثال يوضح مثالنا باستخدام الشيفرة
الواجهة طابور

public interface Queue
{
void enqueue();
Object dequeue();
}

الطابور المبني باستخدام المصفوفة

public class ArrayQueue implements Queue
{
void enqueue(){
//pula pula
}
Object dequeue(){
//pula pula
}
}

الطابور المبني باستخدام الحلقات الثنائية

public class LinkedListQueue implements Queue
{
void enqueue(){
//pula pula
}
Object dequeue(){
//pula pula
}
}

هذه الفئة المصنعة للواجهة طابور

public class QueueFactory
{
public Queue CreateQueue(string length)
{
switch (length) {
case "constant":
return new ArrayQueue ();
case "variable":
return new LinkedListQueue ();
}
return null;
}
}

ملاحظة خارج السياق:نلاحظ أن الاسم ينطبق تماماً على المسمى
فالفئة فعلياً تقوم بدور المصنع الذي له واجهة غير معروف ما بداخلها
الله معكم
شهيد الأقصى

4 Responses to “النمط الثاني:نمط المصنع Factory”

  1. توضيح الهدف من نمط ال Factory :
    الهدف من نمط ال Factory هو عزل المنطق المشترك بين عدة كائنات فى فئة منفصلة
    Separating Common Business Logic In Separate Class
    و يستخدم هذا النمط مع منطق الاعمال المعقد Complicated Business Logic و ليس البسيط اى ليس فى اى حال نستخدم هذا النمط
    مثال بسيط :
    لدينا فى احد المشاريع نستخدم نوعين من البحث احدهما مخصص للبحث فى ال DataTable و البحث الاخر مخصص للبحث فى الملفات النصية
    لدينا عدد من الخصائص و الطرق المشتركة بين الاثنين و لكن لكل طريقة بحث Implementation مختلف و يتم استدعائها بناءاً على نوع البحث المطلوب
    فى هذه الحالة بامكاننا تطبيق ال Factory Pattern و لا سيما ان كان التطبيق من خلال Interface و ليس من خلال Factory Class حتى يكون لديك المرونة فى اضافة انواع جديدة من البحث

  2. admin قال:

    أخ طارق إبراهيم
    لماذا في الأعمال المعقدة فقط؟
    هل هناك سبب غير واضح لاحظ مثلاً في جافا مثلاً أنك لا تلحظ الاختلافات بين أنظمة التشغيل لأن جافا تخفيها باستخدام هذا النمط
    أتفق معك في المنطق المشترك لكني لا أرى التعقيد شيئاً ضرورياً
    أحب أن أسمع وجهة نظرك

    تحياتي

  3. لدى فئتين للتعامل مع بعض الدوال الرياضية و تتشارك كلا الفئتين فى وجود 3 دوال للجمع Addition باشكال مختلفة فهل اقوم باشتقاق Factory Class لفصل ال 3 دوال المتشاركين و استخدم Factory Pattern لا ارى ان الوضع يستحق
    و على كل استخدام ال Factory له وجهات نظر متعددة و كل مطور او مصمم انظمة او معمارى نظم له وجهة نظر عند استخدام ال Patterns

  4. admin قال:

    وجهة نظر أخ طارق
    لكن في برمجة الحزم كل شيء جائز
    أقصد إذا كنت أحتاج إلى تسهيل الأمر على مستخدمي الحزمة
    أو منع حصول لبس لديهم في شيء ما
    سأستخدمها بالتأكيد
    بصراحة لم أواجه حالة مماثلة لكني أظنها ممكنة

    تحياتي

Leave a Reply