<?php
interface IWidget
{
}
class WidgetA implements IWidget
{
}
class WidgetB implements IWidget
{
}
interface IWidgetFactory
{
function tryCreateWidget($someInput, IWidget &$widget);
}
class WidgetAFactory implements IWidgetFactory
{
public function tryCreateWidget($someInput, IWidget &$widget)
{
if ($someInput < 7) {
$widget = new WidgetA();
return true;
}
return false;
}
}
class WidgetBFactory implements IWidgetFactory
{
public function tryCreateWidget($someInput, IWidget &$widget)
{
if ($someInput > 10) {
$widget = new WidgetB();
return true;
}
return false;
}
}
class WidgetFactoryAggregate implements IWidgetFactory
{
private $widgetFactories = [];
function __construct(array $widgetFactories)
{
$this->widgetFactories = $widgetFactories;
}
public function tryCreateWidget($someInput, IWidget &$widget)
{
foreach ($this->widgetFactories as $widgetFactory) {
if ($widgetFactory->tryCreateWidget($someInput)) {
return true;
}
}
return false;
}
}
$widgetFactory = new WidgetFactoryAggregate([
new WidgetAFactory(),
new WidgetBFactory(),
]);
foreach ([1, 5, 15, 9] as $someInput) {
$widget = null;
if ($widgetFactory->tryCreateWidget($someInput, $widget)) {
var_dump($widget);
continue;
}
throw new Exception("Failed to create widget for {$someInput}");
}
preferences:
39.2 ms | 402 KiB | 5 Q