Какой лучший способ реализовать фабричный метод - PullRequest
1 голос
/ 29 декабря 2011

Какой самый лучший способ реализовать фабричный метод.

1) Фабричный метод, содержащий все элементы модели для определения

class UserFactory {
    /**
     * @return UserModel
     */
    function create($firstName, $lastName, $age) {
       $user = new UserModel();
       $user->setFirstName($firstName);
       $user->setLastName($firstName);
       $user->setAge($age);
       return $user;
    }
}

// Usage example
$user = $userFactory->createUser('Yanik', 'Lupien', 99);
$userRepo->persist($user);

2) Фабричный метод, который просто создаетмодель и вернуть ее.После того, как мы можем заполнить модель, используя установщики моделей.

class UserFactory {
    /**
     * @return UserModel
     */
    function create() {
       $user = new UserModel();
       return $user;
    } 
}

// Usage example
$user = $userFactory->create();
$user->setFirstName('Yanik');
$user->setLastName('Lupien');
$user->setAge(99);

$userRepo->persist($user);

3) Фабрика, которая возвращает базу реализации другого класса для параметра

class MyUserFactory {

    const ADMIN = 'admin';
    const SUPER_ADMIN = 'superadmin';

    public function create($type = self::ADMIN)
    {
    switch ($type) {
    case self::SUPER_ADMIN:
        return new UserSuperAdmin($options);
        break;

    case self::ADMIN:
    default:
        return new UserAdmin($options);
        break;
    }
}

// Usage 
$user = $myUserFactory->create(MyUserFactory::SUPER_ADMIN);

if ($user instanceof UserSuperAdmin) {
   $user->setSuperAdminProperties();
}

if ($user instanceof UserAdmin) {
   $user->setAdminProperties();
}

Ответы [ 2 ]

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

Я всегда видел, как применяется фабричный шаблон, когда есть несколько типов, например, пользователей.Например, admin и superadmin .У вас может быть фабричный метод, например, такой:

// within a class named "User" for example
const ADMIN = 'admin';
const SUPER_ADMIN = 'superadmin';

// ...

public static function factory($type = 'admin')
{
    switch ($type) {
        case self::SUPER_ADMIN:
            return new UserSuperAdmin();
            break;

        case self::ADMIN:
        default:
            return new UserAdmin();
            break;
    }
}

Оба - или ЛЮБЫЕ - в этом случае - из классов User implement будут чем-то вроде интерфейса, который определяет те методы получения и установки, которые вы использовали, как setFirstName() и setAge(), например.

Вы также можете определить массив $options или что-то, что будет передаваться каждому из их конструкторов, чтобы сразу создать для вас все эти поля.

public static function factory($type = 'admin', $options = array())
{
    switch ($type) {
        case self::SUPER_ADMIN:
            return new UserSuperAdmin($options);
            break;

        case self::ADMIN:
        default:
            return new UserAdmin($options);
            break;
    }
}

Далее приведен пример одного из конструкторов:

class UserAdmin implements IUserInterface // for example
{
    public function __construct($options)
    {
        // do something with the options array
    }
}

Затем, когда вы создаете его, все так просто:

$user = User::factory('admin');
1 голос
/ 29 декабря 2011

Вы единственный человек, который может решить это. Вам следует рассмотреть следующие варианты:

  1. Будет ли ваш пользовательский экземпляр всегда требовать один и тот же тип ввода в конструкторе? Тогда это хороший выбор для передачи их фабричному методу.
  2. Зависит ли возвращаемый экземпляр от того, какого пользователя вам нужно создать? Если это произойдет, вам придется передать правильные параметры на завод, чтобы он мог решить за вас. В ближайшем будущем важно посмотреть, что вам понадобится. Не сдавай слишком много или слишком мало.
  3. Вы можете создать класс dto ( объект передачи данных ) для определения всех свойств пользователя. Таким образом, вы можете передать много информации фабричному методу, и это может быть более надежным доказательством в будущем (например, роли, разрешения и т. Д.).
  4. Некоторые люди могут сказать, что нужно просто передать всю имеющуюся у вас информацию фабричному методу, чтобы вся логика могла выполняться фабричным методом, даже если это сейчас не требуется.
...