Абстрактная фабрика - паттерн, порождающий объекты.
Назначение:
Предостовляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Применимость:
Используйте паттерн Абстрактная фабрика, когда:
- система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты;
- входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения;
- система должна конфигурироваться одним из семейств составляющих ее объектов;
- вы хотите предоставить библиотеку объектов, раскрывая только их интерфесы, но не реализацию;
Пример:
В абстрактной классе определяется интерфейс для генерации новых классов, но сама генерация производится в классе создателя.
<?php
/** Наша абстрактная фабрика */
abstract class myFactory
{
/** точка входа в фабрику */
static public function getFactory(){
if(Base :: route['get']['mod'] == 'news')
return new newsFactory();
else
return new blogFactory();
}
/** предполагаем что у дочерних классов должны быть методы */
abstract function createMes();
abstract function getError();
}
/** класс новостей */
class newsFactory extends myFactory
{
public function createMes(){
return newsclass :: createMes();
}
public function getError(){
return Base :: getError();
}
}
/** класс блога */
class blogFactory extends myFactory
{
public function createMes(){
return blogclass :: createMes();
}
public function getError(){
return Base :: getError();
}
}
/** запускаем нашу абстрактную фабрику */
$factory = myFactory :: getFactory();
/** создаем новое сообщение */
$factory -> createMes();
/** смотрим ошибки */
$factory -> getError();
?>