🧙♂️️Ce que je comprends plutôt de ce qu'est le StaticFactory :
A la différence de l'AbstractFactory, on ne définit ici qu'une seule classe Factory ; étant donné qu'il n'y a qu'une seule classe Factory, il n'est donc pas nécessaire de mettre du code dans une classe abstraite (donc le fichier 'AbstractSomethingFactory.php' n'existerait pas). Le design pattern StaticFactory est un cas particulier de l'AbstractFactory.
index.php
<?php
$currentHour = (int) date('H');
if ($currentHour < 12) {
echo 'breakfeast';
} elseif ($currentHour < 16) {
echo 'lunch';
} else {
echo 'dinner';
}
<?php
function getMealName($currentHour): string
{
if ($currentHour < 12) {
$mealName = 'breakfeast';
} elseif ($currentHour < 16) {
$mealName = 'lunch';
} else {
$mealName = 'dinner';
}
return $mealName;
}
echo getMealName((int) date('H'));
function getMealTime($currentHour): string
{
if ($currentHour < 12) {
$mealTime = '0h - 12h';
} elseif ($currentHour < 16) {
$mealTime = '12h - 16h';
} else {
$mealTime = '> 16h';
}
return $mealTime;
}
echo getMealTime((int) date('H'));
MealInterface.php
<?php
namespace App\Model\Meal;
interface MealInterface
{
public function getName();
}
AbstractMeal.php
<?php
namespace App\Model\Meal;
abstract class AbstractMeal implements MealInterface
{
protected string $name;
public function getName(): string
{
return $this->name;
}
}
Breakfeast.php
<?php
namespace App\Model\Meal;
class Breakfast extends AbstractMeal implements MealInterface
{
public function __construct()
{
$this->name = 'breakfast';
}
}
Lunch.php
<?php
namespace App\Model\Meal;
class Lunch extends AbstractMeal implements MealInterface
{
public function __construct()
{
$this->name = 'lunch';
}
}
Dinner.php
<?php
namespace App\Model\Meal;
class Dinner extends AbstractMeal implements MealInterface
{
public function __construct()
{
$this->name = 'dinner';
}
}
MealController.php
<?php
namespace App\Meal\Controller;
use App\Meal\Model\Breakfast;
use App\Meal\Model\Lunch;
use App\Meal\Model\Dinner;
class MealController
{
public function index()
{
$currentHour = (int) date('H');
if ($currentHour < 12) {
$meal = new Breakfast();
} elseif ($currentHour < 16) {
$meal = new Lunch();
} else {
$meal = new Dinner();
}
echo $meal->getName();
}
}
MealFactory.php
<?php
namespace App\Meal\Factory;
use App\Meal\Model\MealInterface;
use App\Meal\Model\Breakfast;
use App\Meal\Model\Lunch;
use App\Meal\Model\Dinner;
class MealFactory implements MealFactoryInterface
{
public static function create(int $hour): MealInterface
{
if ($hour < 12) {
$meal = new Breakfast();
} elseif ($hour < 16) {
$meal = new Lunch();
} else {
$meal = new Dinner();
}
return $meal;
}
}
MealFactory.php
<?php
namespace App\Meal\Factory;
use App\Meal\Model\MealInterface;
interface MealFactoryInterface
{
public function create(int $hour): MealInterface;
}
MealController.php
<?php
namespace App\Meal\Controller;
use App\Meal\Factory\MealFactory;
class MealController
{
public function index()
{
$mealFactory = MealFactory::create((int) date('H'));
echo $meal->getName();
}
}
🧙♂️️L'usage des méthodes static est assez déconseillée car le Controller a ici une dépendance avec la classe concrète de la Factory. Si on souhaite utiliser une autre MealFactory, il faudra modifier dans l'ensemble du code cet usage. Mieux vaut que MealFactory implémente l'interface MealFactoryInterface. On injectera ensuite la Factory dans le constructeur des classes qui en dépendent.
📖️️https://designpatternsphp.readthedocs.io/en/latest/Creational/StaticFactory/README.html
📖️️https://waytolearnx.com/2020/02/design-patterns-static-factory-en-php.html