شعار ConstructiCat
CodeBust.
تصفح القسم ▾

استبدال الباني بتابع مصنع (Replace Constructor with Factory Method).

المشكلة

لديك باني (Constructor) معقد يقوم بشيء أكثر من مجرد تعيين قيم المعاملات في حقول الكائن.

الحل

أنشئ تابعاً مصنعاً واستخدمه لاستبدال استدعاءات الباني.

##مثال

قبل
class Employee {
  Employee(int type) {
    this.type = type;
  }
  // ...
}
بعد
class Employee {
  static Employee create(int type) {
    Employee employee = new Employee(type);
    // القيام ببعض العمليات الثقيلة.
    return employee;
  }
  // ...
}

##لماذا نعيد الهيكلة

السبب الأكثر وضوحاً لاستخدام تقنية إعادة الهيكلة هذه يرتبط بتقنية استبدال رمز النوع بفئات فرعية (Replace Type Code with Subclasses).

لديك كود تم فيه إنشاء كائن سابقاً وتمرير قيمة النوع المرمز إليه. وبعد استخدام تقنية إعادة الهيكلة، ظهرت عدة فئات فرعية وتحتاج إلى إنشاء كائنات منها اعتماداً على قيمة النوع المرمز. يعد تعديل الباني الأصلي لجعله يعيد كائنات الفئات الفرعية أمراً مستحيلاً، لذا نقوم بدلاً من ذلك بإنشاء تابع مصنع ثابت (Static factory method) يعيد كائنات من الفئات اللازمة، وبعد ذلك يستبدل جميع استدعاءات الباني الأصلي.

يمكن استخدام التوابع المصنعة في مواقف أخرى أيضاً عندما لا تكون البانيات قادرة على أداء المهمة. ويمكن أن تكون مهمة عند محاولة تغيير القيمة إلى مرجع (Change Value to Reference). كما يمكن استخدامها أيضاً لتعيين أوضاع إنشاء مختلفة تتجاوز عدد وأنواع المعاملات.

##الفوائد

  • لا يعيد التابع المصنع بالضرورة كائناً من الفئة التي تم استدعاؤه فيها. غالباً ما تكون الفئات الفرعية لها، والمحددة بناءً على الوسائط الممررة للتابع.

  • يمكن أن يحصل التابع المصنع على اسم أفضل يصف ما يفعله وكيف يعيد نتيجته، على سبيل المثال Troops::GetCrew(myTank).

  • يمكن للتابع المصنع إعادة كائن تم إنشاؤه بالفعل، على عكس الباني الذي يقوم دائماً بإنشاء نسخة جديدة.

##كيفية إعادة الهيكلة

  1. أنشئ تابعاً مصنعاً (Factory method). وضع استدعاءً للباني الحالي بداخله.

  2. استبدل جميع استدعاءات الباني باستدعاءات للتابع المصنع.

  3. صرح بأن الباني خاص (Private).

  4. تفحص كود الباني وحاول عزل الكود غير المرتبط مباشرة بإنشاء كائن من الفئة الحالية، وانقل هذا الكود إلى التابع المصنع.