Шаблон проектирования абстрактная фабрика на PHP
![Шаблон проектирования абстрактная фабрика на PHP](/images/articles/php-abstract-factory.jpg)
При создании программ часто возникают такие ситуации, которые уже хорошо изучены и для которых существует общепризнанное оптимальное решение - шаблон проектирования. Одним из таких решений является абстрактная фабрика о которой и пойдет речь далее.
Абстрактная фабрика - это порождающий шаблон проектирования, который позволяет создавать семейства связанных объектов без указания их конкретных классов.
Но данное определение мало информативно, поэтому покажу сразу код, попутно комментируя непонятные участки.
<?php
// общий интерфейс для всех телефонов
interface Phone {
function call(); // звонок
}
// конкретная реализация телефона
class IPhone implements Phone
{
function call() {
print("Iphone::call звонит..." . PHP_EOL);
}
}
// конкретная реализация телефона
class Android implements Phone
{
function call() {
print("Android::call звонит..." . PHP_EOL);
}
}
// интерфейс всех телевизоров
interface TV
{
function getBrand() : string; // возвращает производителя
}
// конкретная реализация телевизора
class SmartTV implements TV
{
function getBrand() : string
{
return "Производитель телевизора: ООО \"Новый Кинескоп\"". PHP_EOL;
}
}
// конкретная реализация телевизора
class SimpleTV implements TV
{
function getBrand() : string {
return "Производитель телевизора: ЗАО \"Совхоз@Net\"" . PHP_EOL;
}
}
// абстрактная фабрика устройств, где производятся как телевизоры так и телефоны
abstract class ProductFactory
{
abstract function getTV(string $tvType) : ?TV; // возвращает фабрику для TV
abstract function getPhone(string $phoneType) : ?Phone; // возвращает фабрику для Phone
}
// фабрика для телефонов
class PhoneFactory extends ProductFactory
{
function getPhone(string $phoneType) : ?Phone
{
if($phoneType == null) {
return null;
}
return new $phoneType(); // эта особенность PHP позволяет обойтись без условных конструкций
// создаем объект на основе переданного строкового представления класса
}
// этот метод не нужен для данного объекта, поэтому возвращаем null
function getTV(string $tvType) : ?TV {
return null;
}
}
// тоже самое, что и предыдущий класс
class TVFactory extends ProductFactory
{
function getTV(string $tvType) : ?TV
{
if($tvType == null) {
return null;
}
return new $tvType();
}
function getPhone(string $phoneType) : ?PHone {
return null;
}
}
// фабрика по производству фабрик
// тоже самое, что и обычная фабрика, с той лишь разницей, что создает другие фабрики
// возвращая объект, реализующий интерфейс абстрактной фабрики
class FactoryProducer
{
public static function getFactory(string $productType) : ProductFactory
{
return new $productType();
}
}
class Program
{
public static function main() {
//получаем объект фабрики телефонов
$phoneFactory = FactoryProducer::getFactory("PhoneFactory");
// IPhone
$iphone = $phoneFactory->getPhone("IPhone");
$iphone->call();
// Android
$android = $phoneFactory->getPhone("Android");
$android->call();
// фабрика по производству телевизоров
$tvFactory = FactoryProducer::getFactory("TVFactory");
// SmartTV
$tv = $tvFactory->getTV("SmartTV");
print $tv->getBrand();
// SimpleTV
$tv = $tvFactory->getTV("SimpleTV");
print $tv->getBrand();
}
}
Program::main();
Таким образом, одна абстрактная фабрика порождает другие фабрики, которые уже непосредственно занимаются созданием конкретных объектов. При этом абстрактная фабрика в PHP просто содержит в себе набор абстрактных методов для создания объектов каждого типа.
-
-
Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.