Abstract Factory

GOF Intent:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

از عيب هاي Factory Method Pattern اين است که Creator Concrete، بايد مستقيما در کد ذکر شود. در Abstract Factory اين مشکل وجود ندارد. تفاوت اصلي Factory Method و Abstract Factory همين است.

Abstract Factory Pattern به نام KIT نيز شناخته مي‌شود.

Abstract Factory يک interface يا کلاس abstract است که signature متدهاي ساخت Object ها در آن تعريف شده است و Concrete Factory ها آنها را implement مي‌نمايند.
در Abstract Factory Pattern همه Product هاي هم خانواده در Concrete Factory مربوط به آن خانواده پياده سازي و مجتمع مي‌گردند.
در کدهاي برنامه تنها با Abstract Factory و Abstract Product ها سر و کار داريم و به هيچ وجه درگير اين مساله که کدام يک از Concrete Class ها در برنامه مورد استفاده قرار مي‌گيرند، نمي‌شويم.

شکل زير ساختار Abstract Factory را نشان مي‌دهد:

Abstract Factory Pattern

نمونه کد:

interface Connection(){
   public void doConnect();
}

class OracleConnection implements Connection{
   public void doConnect(){
      // Connect to Oracle DB
   }
}

class SqlServerConnection implements Connection{
   public void doConnect(){
      // Connect to SQL Server DB
   }
}

interface ConnectionFactory {
   public Connection CreateConnection();
}

class OracleConnectionFactory implements ConnectionFactory {
   public Connection CreateConnection(){
      return new OracleConnection();
   }
}

class SqlServerConnectionFactory implements ConnectionFactory {
   public Connection CreateConnection(){
      return new SqlServerConnection();
   }
}

public class ConnectionServices{
   public static ConnectionFactory getConnectionFactory(){
      if (type == DB_TYPE_ORACLE){
         return new OracleConnectionFactory();
      } else if (type == DB_TYPE_SQLSERVER) {
         return new SqlServerConnectionFactory();
   }
}

public class ClientApp{
   public static void main(String[] args){
      ConnectionFactory aConnectionFactory = ConnectionServices.getConnectionFactory();
      Connection aConnection = aConnectionFactory.CreateConnection();
      aConnection.doConnect();
   }
}

فايده هاي Abstract Factory:

  • پياده سازي و نامگذاري Product در Factory مربوطه متمرکز مي شود و بدين ترتيب Client به نام و نحوه پياده سازي Type هاي مختلف Product وابستگي نخواهد داشت.
  • به راحتي مي توان Concrete Factory مورد استفاده برنامه را تغيير داد، بدون اينکه تاثيري در عملکرد ساير بخشها داشته باشد.
  • در مواردي که بيش از يک محصول براي هرخانواده وجود داشته باشد، استفاده از Abstract Factory تضمين مي کند که Product هاي هر خانواده همه در کنار هم قرار دارند و با هم فعال و غير فعال مي شوند. (يا همه، يا هيچکدام)

عيب Abstract Factory:

  • عيب بزرگ Abstract Factory اين است که با اضافه شدن فقط يک Product تازه، Abstract Factory بايد تغيير کند که اين مساله منجر به تغيير همه Concrete Factory ها مي‌شود.

تکنيک هاي مفيد در مورد Abstract Factory:

  • Factory ها معمولا Singleton هستند. زيرا هر Application بطور معمول فقط به يک instance از هر ConcreteFactory نياز دارد.
  • انتخاب ConcreteFactory مناسب معمولا توسط پارامترهايي انجام مي شود.
  • مي توان پياده سازي متد انتخاب ConcreteFactory مناسب را در خود Abstract Factory قرار داد. در اين صورت Abstract Factory نبايد interface باشد و فقط بايد abstract class باشد. اعمال اين تکنيک در مورد مثال بالا اينگونه مي‌شود که کلاس ConnectionServices کلا حذف مي‌شود و متد getConnectionFactory آن به کلاس ConnectionFactory منتقل مي‌گردد.

منبع ها:

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

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

پاسخ دهید

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

*


6 − شش =

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

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