- Output for 8.1.23 - 8.1.30, 8.2.2 - 8.2.24, 8.3.0 - 8.3.12
- Drawing general elements Drawing arrows elements
<?php
abstract class ToolSetFactory
{
protected array $products = [];
public function make(string $productName, ...$params): Drawable
{
if ($product = $this->products[$productName] ?? null)
return new $product($params);
return new NullProduct();
}
}
class BasicToolSetFactory extends ToolSetFactory
{
public function __construct()
{
$this->products['general'] = GeneralProduct::class;
$this->products['arrows'] = ArrowsProduct::class;
}
}
// Interfaces
interface Drawable
{
public function draw(): void;
}
interface General extends Drawable {}
interface Arrows extends Drawable {}
// Product classes
class GeneralProduct implements General
{
public function draw(): void
{
print "Drawing general elements\n";
}
// Other methods
}
class ArrowsProduct implements Arrows
{
public function draw(): void
{
print "Drawing arrows elements\n";
}
// Other methods
}
// Client code
class BasicToolSet
{
public function createToolSet(ToolSetFactory $factory): void
{
$general = $factory->make('general');
$arrows = $factory->make('arrows');
foreach ([$general, $arrows] as $product) {
$product->draw();
}
}
}
// Usage
$basicToolSetFactory = new BasicToolSetFactory();
$basicToolSet = new BasicToolSet();
$basicToolSet->createToolSet($basicToolSetFactory);