Шаблон проектирования фабрика (factory method)


Цель:

  • Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанциировать.
  • Позволяет классу делегировать создание подклассам.


Применение:

  • Классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
  • Класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами.
  • Класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

Т.е. классу заранее неизвестно, какие классы нужно создавать. Как правило всегда в этом шаблоне используется какой-то интерфейс (или абстрактный класс) общий базовый. От этого интерфейса создаются (наследуются) конкретные продукты.

На картинке выше видим класс-создатель Creator, в котором описывается метод, в котором все и происходит, в котором происходит создание того или иного объекта или класса.

Рассмотрим пример:

[php]
abstract class User {
protected $name = null;
function _construct($name){
$this->name = $name;}
function getName(){
return $this->name;}
//Методы определения прав доступа
function hasReadPermission(){
return true;}
function hasModifyPermission(){
return false;}
function hasDeletePermission(){
return false;}
//классы-наследники от базового класса
class GuestUser extends User {} //наследует все из базового класса
class CustomerUser extends User { //может читать и изменять
function hasModifyPermission(){
return true;} //
}
class AdminUser extends User { //админ, может все
function hasmodifyPermission(){
return true;}
function hasDeletePermissoin(){
return true;}
function wantsFlashInterface(){
return false;}
}
//фабричный метод
class UserFactory {
private static $users = array («Max»=>»admin», «Mikki»=>»guest», «Ann»=>»customer»);
static function Create($name){
if(!isset(self::$users[$user])){
//выскочит ошибка — пользователь не зарегистрирован
}
switch (self::$users[$user]){
case «guest»:return new GuestUser ($name);
case «customer»:return new CustomerUser ($name);
case «admin»:return new AdminUser ($name);
default://ошибка — неизвестный тип пользователя}
}
}
[/php]

Есть абстрактный класс User, у которого свойство name. В конструктор передается имя, и заполняет наше свойство. Далее описаны методы определения прав доступа, которые возвращают true-false. Т.е. пользователь может читать, изменять, удалять. Мы определили, что читать могут все по умолчанию — это базовый класс. На основе этого базового класса создаются классы-наследники. Мы создали три типа пользователей с определенными правами. Т.е. класс user — это абстрактный класс, а потом пошли продукты: admin, customerUser.

Далее в примере видим UserFactory, в котором и находится фабричный метод. Допустим, есть три пользователя: guest, admin, customer. У нас есть статический метод Create, который получает имя на входе (проверяем, есть такое имя или нет). В switch смотрим, если он админ — возвращаем экземпляр класса admin, если он гость — возвращаем экземпляр класса guest и т.д.


Ваш комментарий

Ваш адрес email не будет опубликован.

Для отправки комментария, поставьте отметку, что разрешаете сбор и обработку ваших персональных данных . Политика конфиденциальности