fabrika

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

Цель:

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


Применение:

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

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

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

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

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://ошибка - неизвестный тип пользователя}
}
}

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

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




Добавить комментарий

Ваш e-mail не будет опубликован.