نمط التصميم البرمجي المشهور المعروف بـ “Factory Method” هو إحدى الأنماط السائدة في عالم البرمجة الشيئية، ويعتبر جزءًا لا يتجزأ من مجموعة أنماط التصميم التي تهدف إلى تحسين هيكل وتنظيم الشيفرة المصدرية. يتميز هذا النمط بفعاليته في تحقيق التفاعل بين الكائنات وتقديم وسيلة موحدة لإنشاء كائنات دون الحاجة للكشف عن التفاصيل الداخلية لعملية الإنشاء.
في جوهره، يعتمد نمط Factory Method على تحويل عملية إنشاء الكائنات إلى فئة مستقلة عند استخدامها. يقوم هذا النمط بتحديد واجهة لإنشاء الكائنات، ولكن يترك تفاصيل عملية الإنشاء نفسها للفئات المشتقة. يعني ذلك أنه يمكن للكائنات الفرعية تحديد نوع وتكوين الكائنات التي يتم إنشاؤها.
-
عرض عداد تنازلي على شريط الحالة في Android25/03/2024
-
تجميع وتشغيل مشروع JonBot-NG في NetBeans31/01/2024
لفهم كيف يعمل هذا النمط بشكل أفضل، دعونا نفترض أن لدينا واجهة Product
ونريد إنشاء عدة أنواع من المنتجات، مثل ConcreteProductA
و ConcreteProductB
. يمكننا تحديد واجهة Creator
التي تحتوي على الطريقة الخاصة بإنشاء المنتجات، ولكن لا تحدد تفاصيل الإنشاء بشكل كامل. بدلاً من ذلك، يتم ترك هذه التفاصيل للفئات المشتقة.
هنا يأتي دور الطريقة FactoryMethod
حيث يتم تنفيذها في الفئات المشتقة لتحديد كيفية إنشاء المنتجات الفعلية. على سبيل المثال:
python# واجهة المنتج
class Product:
def operation(self):
pass
# منتج محدد A
class ConcreteProductA(Product):
def operation(self):
return "ConcreteProductA operation"
# منتج محدد B
class ConcreteProductB(Product):
def operation(self):
return "ConcreteProductB operation"
# واجهة المنشئ
class Creator:
def factory_method(self):
pass
def operation(self):
product = self.factory_method()
return f"Creator: {product.operation()}"
# منشئ محدد A
class ConcreteCreatorA(Creator):
def factory_method(self):
return ConcreteProductA()
# منشئ محدد B
class ConcreteCreatorB(Creator):
def factory_method(self):
return ConcreteProductB()
# استخدام النمط
creator_a = ConcreteCreatorA()
result_a = creator_a.operation()
print(result_a) # Output: "Creator: ConcreteProductA operation"
creator_b = ConcreteCreatorB()
result_b = creator_b.operation()
print(result_b) # Output: "Creator: ConcreteProductB operation"
يظهر الكود أعلاه كيف يمكن استخدام نمط Factory Method لتحقيق مرونة أكبر في إنشاء الكائنات دون الحاجة إلى تغيير الشيفرة المصدرية للفئات المنشئة.
المزيد من المعلومات
بالطبع، دعونا نعمق في المزيد من التفاصيل حول نمط Factory Method.
هيكل النمط:
-
Product (المنتج):
- واجهة تحدد الكائن الذي سيتم إنشاؤه من قبل المصنع وتحتوي على العمليات المحددة له.
-
ConcreteProduct (المنتج المحدد):
- تنفيذ فعلي لواجهة المنتج، حيث يتم تحديد هيكل وسلوك المنتج.
-
Creator (المنشئ):
- واجهة تعرف الطريقة
factory_method
التي يستخدمها المصنع لإنشاء المنتج.
- واجهة تعرف الطريقة
-
ConcreteCreator (المنشئ المحدد):
- تنفيذ فعلي لواجهة المنشئ حيث يتم تحديد الطريقة
factory_method
لإنشاء المنتج المحدد.
- تنفيذ فعلي لواجهة المنشئ حيث يتم تحديد الطريقة
فوائد نمط Factory Method:
-
تجنب التباعد (Decoupling):
- يسمح لك بتجنب الارتباط القوي بين الكلاسات المنشئة والمنتجة، مما يجعل النظام أكثر مرونة.
-
توسيع السهولة (Ease of Extension):
- يسهل إضافة منتجات جديدة ومنشئين جدد دون تغيير الشيفرة المصدرية للكلاسات القائمة.
-
تجنب تكرار الشيفرة (Code Reusability):
- يساعد في تجنب تكرار الشيفرة عند إنشاء كائنات متشابهة.
تطبيق عملي:
في بيئات البرمجة الحقيقية، يمكن رؤية نمط Factory Method في مجموعة متنوعة من المواقف، مثل إطارات العمل (frameworks)، حيث يتيح هذا النمط للمطورين تمديد أو استبدال أجزاء من النظام دون التأثير على بقية الشيفرة.
على سبيل المثال، في إطار لتصميم واجهة المستخدم، قد يكون هناك Factory Method يستخدم لإنشاء عناصر واجهة المستخدم مثل الأزرار أو المربعات النصية. يمكن للمطورين تعديل أو استبدال هذه العناصر دون الحاجة لتعديل الشيفرة في الأماكن الأخرى.
بهذا، يكون نمط Factory Method أحد الأساليب الفعالة لتحسين تصميم البرمجيات، مما يساعد على تحقيق التوسعية والصيانة بشكل أفضل في الأنظمة البرمجية.