Factory Method

GOF intent:
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

روش سنتي ساخت instance از کلاس اينگونه است که هرجا لازم باشد از دستور new استفاده نماييم.
مثال:

class UIFrameWork{

   public static UIComponent CreateUI(){
      UIComponent aUI = new UIComponent();
      TextboxComponent aText = new TextboxComponent();
      ButtonComponent aBtn = new ButtonComponent();

      aUI.addTextbox(aText);
      aUI.addButton(aBtn);
      return aUI;
   }
}

اين کار اشکالاتي دارد:

  • باعث وابستگي زياد ميان کلاس سازنده و کلاس ساخته شده مي گردد.
  • افزودن و تغيير در کلاس‌ها را دشوار مي سازد.
  • امکان استفاده مجدد (Reusability) را کاهش مي‌دهد.

فرض کنيد در مثال فوق بخواهيم علاوه بر UI ساده، UI با قابليت Scroll نيز ارائه دهيم. در اين صورت با وجودي که بخش زيادي از عناصر UI از جمله TextBox و Button بدون تغيير است، اما مجبوريم کد بالا را عينا براي UI جديد نيز بنويسيم:

class UIFrameWork{

   public static UIComponent CreateUI(){
      // Above Code
   }

   public static UIComponent CreateScrollingUI(){
      ScrollingUIComponent aUI = new ScrollingUIComponent();
      TextboxComponent aText = new TextboxComponent();
      ButtonComponent aBtn = new ButtonComponent();

      aUI.addTextbox(aText);
      aUI.addButton(aBtn);
      return aUI;
   }
}

راه حل: استفاده از Factory Method
Factory Method به متدي گفته مي شود که new شدن instance توسط آن انجام مي‌شود.
شکل زير ساختار اجزاي Factory Pattern را نشان مي دهد.

Factory Method Pattern

بازنويسي مثال فوق با استفاده از Factory Method:

class UIFrameWork{

   public static UIComponent makeUIComponent (){
      return new UIComponent;
   }

   public static TextboxComponent makeTextboxComponent(){
      return new TextboxComponent;
   }

   public static ButtonComponent makeButtonComponent (){
   return new UIComponent;
   }

   public static UIComponent CreateUI(){
      UIComponent aUI = makeUIComponent();
      TextboxComponent aText = makeTextboxComponent();
      ButtonComponent aBtn = makeButtonComponent();

      aUI.addTextbox(aText);
      aUI.addButton(aBtn);
      return aUI;
   }
}

class ScrollingUIFrameWork extends UIFramework{

   public static UIComponent makeUIComponent (){
      return new ScrollingUIComponent;
   }
}

ملاحظه مي‌شود که با Extend کردن از کلاس اصلي و Override کردن متد makeUIComponent مي‌توان UI با امکان Scroll ايجاد نمود.
در اين مثال Factory Method ها عبارتند از:

  • makeUIComponent
  • makeTextboxComponent
  • makeButtonComponent

فايده هاي :Factory Method

  • در کد برنامه درگير ساخت مستقيم Concrete Class ها نمي شويم
  • فرايند ساخت کلاس‌هاي مرتبط با هم در يک جا جمع شده و نظم مي‌گيرد. بدين ترتيب تعريف Subclass ها نيز روشن‌تر و ساده‌تر انجام مي‌شود.

عيب‌هاي Factory Method:

  • براي تعريف هر Concrete Class جديد مجبوريم که يک Subclass از Creator تعريف کنيم.
  • اينکه از کدام Creator بايد استفاده شود مستقيما در کد ذکر مي شود. (تفاوت اصلي با Abstract Factory)

منبع ها:

1- Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
2- codeproject

با برچسب:
پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


یک + = 2

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com