Шаблон проектирования factory php ещё называют фабричный метод.
Он позволяет создавать объекты во время работы нашего веб приложения.
То есть этот шаблон называют Фабрикой потому что он отвечает за производством объектов.
Давайте посмотрим на примере как можно его использовать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php class MyFactory { static function factory($name) { if( include $name.".php" ) { return new $name; }else { exit("Не существует файл!"); } } } ?> |
Сама идея этого шаблона: чтобы создать объект некоторого класса нам необходимо обратиться к классу MyFactory (например) у этого класса обращаемся к статическому методу factory (например) и передаём ему имя класса объект которого Мы хотим получить, далее уже пишем все по нашему усмотрению.
Что-то похожее на автоматическую загрузку классов только тут ещё и объект создаётся.
Данный шаблон используется в различных фреймворках на PHP, и в Joomla (новой версий).
Шаблон фабрика используется когда необходимо создать объект одного класса, наследуя какой-то главный класс (глобальный).
Вот ещё один классический пример использования шаблона factory:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php abstract class User { // можно использовать и абстрактные классы public $name; public function __construct($name) { $this->name = $name; } public function get_name() {//ещё один метод, для примера return $this->name; } } //теперь нужно делать наследные классы class Moderator extends User { public function get_name() { // сделаем это чтоб понять метод какого объекта вызываеться $str = parent::get_name(); return $str." ".__CLASS__; } } // таких классов как "Moderator можно создать сколько угодно" class Admin extends User { public function get_name() { // сделаем это чтоб понять метод какого-то объекта вызываеться $str = parent::get_name(); return $str." ".__CLASS__; } } class UserFactory { static function create($name, $userName) { // тут уже назвали не "factory" switch ($name) { case 'Moderator': return new Moderator($userName); break; case 'Admin': return new Admin($userName); break; } } } $admin = UserFactory::create("Admin", "Иван"); echo $admin->get_name(); // Вывод: Иван Admin ?> |