Что это за шаблон дизайна?

Я читал статьи Википедии на FactoryMethod и AbstractFactory, но следующий код нигде не подходит. Может ли кто-нибудь объяснить мне, что это за шаблон или это анти-шаблон?

interace PaymentGateway{
  void makePayment();
}

class PaypalPaymentGateway implements PaymentGateway
{
  public void makePayment()
  {
    //some implementation
  }
}


class AuthorizeNetPaymentGateway implements PaymentGateway
{
  public void makePayment()
  {
    //some implementation
  }
}

class PaymentGatewayFactory{
  PaymentGateway createPaymentGateway(int gatewayId)
  {
    if(gatewayId == 1)
      return PaypalPaymentGateway();
    else if(gatewayId == 2)
      return AuthorizeNetPaymentGateway();
  }
}

Допустим, пользователь выбирает способ оплаты с помощью переключателя на странице html, а gatewayId выводится из значения переключателя.

Я видел такой код и думал, что это шаблон AbstractFactory, но после прочтения статьи в Википедии у меня возникли сомнения.


person Can't Tell    schedule 04.06.2014    source источник
comment
да, это шаблон стратегии   -  person Oliver Watkins    schedule 04.06.2014
comment
@Juvanis это не шаблон стратегии, шаблон стратегии дает вам возможность изменить поведение вашего экземпляра на лету, передав одному из его методов аргумент, который будет использоваться для использования новой стратегии.   -  person Mifmif    schedule 04.06.2014


Ответы (3)


класс шлюза реализует шаблон стратегии с выбором, делегированным тому, что я бы назвал параметризованной фабрикой.

Если вы хотите свести его к одному из шаблонов GOF, я бы сказал, что это больше похоже на шаблон построителя, сжатый в сокращенный вызов вместо установки стратегии и последующего вызова build ().

Если вы хотите расширить до шаблонов Фаулера, вы можете сравнить его с реестром

person Lorenzo Boccaccia    schedule 04.06.2014

Это не фабричный паттерн, абстрактный фабричный паттерн или паттерн-компоновщик. У них есть определенные цели, и ни одно из них не соответствует коду.

Но, как некоторые предположили, интерфейс PaymentGateway и конкретные классы реализуют шаблон стратегии. Идея шаблона стратегии полностью совпадает: «Определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми. Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют».

Шаблон стратегии не обязательно должен обладать изменением поведения на лету. Это зависит от клиентского кода (кода, который использует абстракцию шаблона стратегии).

PaymentGatewayFacotry не соответствует ни одному шаблону GoF. Это не соответствует назначению шаблона фабрики, абстрактного шаблона фабрики или шаблона построителя. Как предположил Лоренцо, вы можете назвать это параметризованной фабрикой или параметризованным селектором. Однако это плохо запрограммированный класс. Это нарушает принцип открытия-закрытия.

person Community    schedule 04.06.2014
comment
Я не понимал, почему PaymentGatewayFactory плохо запрограммирована. Не могли бы вы объяснить? - person Can't Tell; 05.06.2014
comment
Потому что, если вы добавляете в систему еще один PaymentGateway, вам необходимо изменить существующий код PaymentGatewayFactory. Это никогда не кончится, правда? Однако, если вас устраивают такие проблемы, вы можете прекратить свои дизайнерские усилия. Если вы хотите, чтобы эта проблема была решена, вы можете изменить PaymentGatewayFactory. Вы хотите жить с Фабрикой, которая может производить только два типа объектов? Или вам нужна фабрика, которая может производить множество типов объектов определенного типа (PaymentGateway)? - person ; 05.06.2014
comment
Спасибо за объяснение. Как бы вы посоветовали привести класс в соответствие с принципом открытости-закрытости? Чтобы фабрика могла создать экземпляр PaymentGateways, не зная заранее типа, я думаю, что ей нужно будет получить какой-то другой объект (ы) для создания для него PaymentGateways. И этот другой объект будет иметь интерфейс / абстрактный тип? - person Can't Tell; 05.06.2014

В книге Крейга Лармана раздел приложений (UML и шаблоны) 26.4) он называет это Simple Factory или Concrete Factory и говорит, что это не шаблон GoF, но чрезвычайно широко распространен.

В Head First Design Patterns также есть место для этого шаблона. :

Simple Factory на самом деле не является шаблоном проектирования; это скорее идиома программирования. Но он широко используется, поэтому мы дадим ему почетную награду Head First Pattern. Некоторые разработчики ошибочно принимают эту идиому за «заводской шаблон», поэтому в следующий раз, когда между вами и другим разработчиком возникнет неловкое молчание, у вас будет хорошая тема, чтобы сломать лед.

Фриман, Эрик; Робсон, Элизабет; Бейтс, Берт; Сьерра, Кэти (2004-10-25). Head First Design Patterns (Kindle Locations 1920-1923). O'Reilly Media. Разжечь издание.

[Edit] Мне нравится эта запись в блоге, в которой объясняется разница между Simple Factory, Factory Method и Абстрактная фабрика.

person Fuhrmanator    schedule 05.06.2014