Это шаблон или похож на шаблон, и как его зовут - PullRequest
1 голос
/ 21 декабря 2011

У меня есть 3 класса:

  • интерфейсный класс, который определяет несколько методов
  • 2 класса, которые реализуют этот интерфейс Class_A и Class_B

Затем у меня есть класс, который в основном выбирает, какой класс (A или B) создавать, основываясь на некотором условии.

class Chooser
{
   public static function choose($condition)
   {
      $class = 'Class_' . ucfirst($condition);  
      return new $class();
   }
}

Затем я вызываю статический метод выбора, и он возвращает экземпляр нужного класса (A или B)

Chooser::choose($condition);

Мои вопросы:

  • прежде всего, является ли это действительным шаблоном (или близким к шаблону), и как его называют
  • если он близок к шаблону, как я могу изменить его так, чтобы это был правильный шаблон
  • в-третьих, класс Chooser очень прост.Я мог бы иметь эту логику в своем исходном коде вместо Chooser::choose($condition);.Если я сделаю это, будет ли это теперь мешать шаблону?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Да, ваш пример подходит как Factory Pattern.Это один из творческих паттернов.

В исходном коде делайте все кодирование, основываясь на вашем интерфейсе.Ответственный за выбор будет отвечать за правильный выбор класса для создания экземпляра.Делая это, вы бы достигли высокого разделения интересов.Об этом подробнее здесь.http://www.oodesign.com/factory-pattern.html

2 голосов
/ 21 декабря 2011

Я бы не назвал это шаблоном, поскольку это конкретный код.Шаблоны - это просто описания того, что можно сделать как.Это немного похоже на реализацию шаблона Factory, и если вы назовете его Factory, большинство пользователей могут быстрее понять, для чего он предназначен.

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

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

class Chooser
{
  /**
   * @return interface
   */
   public static function choose($condition)
   {
      $class = 'Class_' . ucfirst($condition);
      if (!is_a($class, 'interface'))
          return NULL;
      return new $class();
   }
}

Для этого нужны некоторые конкретные версии PHP, и на них могут влиять ошибки в PHP из-за is_a.Существуют альтернативные способы проверить, реализует ли конкретное имя класса интерфейс.Я оставляю это как упражнение.

Вам также необходимо решить, возвращает ли функция chooser() NULL, если условие не приводит к объекту или если оно должно вызвать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...