نظرة على static factory method

بسم الله الرحمن الرحيم

عندما نريد إنشاء  instance من class معين فإننا غالبا ما نقوم بإستخدام public constructor, لكن هنا طريقة أخرى, يجب أن يكون المبرمج ملماً بها, ألا وهي  public static factory method. ببساطة شديدة هي دالة static تقوم بإرجاع -return- لـ instance   من  class, على سبيل المثال:

كما نلاحظ أن المفهوم في غاية البساطة, لكن متى أحتاج أن أستخدمه ؟ , سنقوم الان بالمقارنة بينه وبين  Constructor, ونستعرض المميزات والعيوب.

أولا, تتميز static factory method بكونها قابلة لتسمية, فعلى سبيل المثال لو كان لدينا مركز رياضي ونوعين من العملاء, مشترك وزائر, المشترك ندخل أسمه, أما الزائر فنكتب فقط زائر, فسيكون شكل class كالتالي

دعنا نقوم بإستدعائها, واستدعاء constructor.

كما نلاحظ, في static factory method من النظرة الأولى, تمكنت من معرفة نوع العميل, بالإضافة إلى أنه لو أراد شخص ما إكمال تطوير المشروع, سيتمكن من التعامل مع class الذي قمت ببنائه دون النظر فيه -Readability-, على عكس  public constructor.

ثانيا, من خلال static factory method يمكنك أن تجبر مستخدم الـ class على إنشاء instance واحد فقط لهذا الـ class, وهو ما نسميه بـ singleton, كما في المثال

كما نلاحظ أن constructor private, بمعنى أنه لا يمكنك إنشاء instance عن طريقه, لكن تستخدم static factory method والتي دائما ستعيد لك نفس  object الذي هو client, وبهذا لن تحصل إلا على object واحد فقط عن طريق هذا class.

ثالثا, يمكن لـ static factory method أن يقوم بعمل return لـ  instance من sub-type لـ class, على سبيل المثال لدينا class يقوم بإزالة الزوائد من القيم الداخلة إليه, مثلا لو تلقى قيمة 0010 يقوم بحذف الأصفار, ولو تلقى “محمد  ” يقوم بحذف space وهكذا, لنبدأ في الكود.
بداية سنقوم بإنشاء Interface بإسم  trimmer

الان, سنقوم بإنشاء class لتعامل مع String

وأخر لتعامل مع Integer

نلاحظ أن access modifier  لـ constructor من نوع  package-private أي لا يمكن الوصول إليه من خارج  package,  ثم نقوم بإنشاء class  نستخدمه إذا ما أردنا الإستفادة من classes السابقة

نلاحظ هنا كيف استفدنا من static factory method, بحث أنه قام بإرجاع object, عبارة عن sub-type لـ return type.

وفي main نستدعيه بالطريقة التالية:

وهذا الأسلوب يسمى  interface-based API أو interface-based frameworks

بعد استعراضات المميزات لـ static factory method, لنستعرض السلبيات, وهما اثنتين.

الأولى, لا يمكن الوراثة -inheritance- من class لا يوجد فيه public or protected constructor, ففي هذه الحالة لا يمكن لـ static factory method أن تعوض constructor.

الثانية, أن static factory method قد لا يمكن تمييزها بسهولة عن بقية static methods التي بداخل class,  لذلك تستخدم عادة بعض التسميات المتعارف عليها, لتحل هذه المشكلة.

الان, لنمثل علىstatic factory method في Android, فلو أردنا أن نقوم بإنشاء activity داخلها fragment سيكون الكود كالتالي

وفي Activity أخرى

لنقوم الان بتحسين هذا الكود, سنقوم بالتالي, أولا بناء static factory method داخل fragment

ثم نقوم ببناء BaseActivity كالتالي

لاحظ هنا أن هناك دالة ستعيد لنا fragment سنستخدمها داخل  oncreate, وستظهر فائدة هذا الشيء عندما نجعل MainActivityb و SecoundActivity ترث منها, فيكون شكل الكود  كالتالي

 

إلى هنا أتمنى أن أكون وفقت في تبسيط هذا المفهوم,

والسلام عليكم ورحمة الله وبركاته.

المصادر:
Big nerd ranch Android

Effective java

Static factory methods vs traditional constructors

اترك تعليقاً