14 - seeren-training/Design-Pattern GitHub Wiki

Flyweight

  • 🔖 Définition
  • 🔖 Implémentation

📑 Définition

Le modèle de poids mouche est utile lorsque vous traitez un grand nombre d'objets avec des éléments répétés simples qui utiliseraient une grande quantité de mémoire s'ils étaient stockés individuellement. Il est courant de conserver les données partagées dans des structures de données externes et de les transmettre temporairement aux objets lorsqu'ils sont utilisés.

image

Les objets poids mouche peuvent:

  • Stocker un état intrinsèque invariant, indépendant du contexte et partageable.
  • Fournir une interface pour passer à l'état extrinsèque qui est variable, dépendant du contexte et ne peut pas être partagé

📑 Implémentation

Invariant

class Coffee
{

    private string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }

}

Variant

class Order
{

    private static array $coffees = [];

    public static function takeOrder(string $name, int $tableNumber): array
    {
        if (!array_key_exists($name, Order::$coffees)) {
            self::$coffees[$name] = new Coffee($name);
        }
        return [
            "table" => $tableNumber,
            "coffee" => self::$coffees[$name]
        ];
    }

}

Client

class CoffeeShop
{

    private array $orders = [];

    public function takeOrder(string $flavour, int $tableNumber)
    {
        $this->orders[] = Order::takeOrder($flavour, $tableNumber);
    }

    public function getOrders(): array
    {
        return $this->orders;
    }

}

Utilisation

$coffeeShop = new CoffeeShop();

$coffeeShop->takeOrder("Caramel", 5);
$coffeeShop->takeOrder("Vanilla", 8);
$coffeeShop->takeOrder("Caramel", 4);
$orders = $coffeeShop->getOrders();

array_walk(
  $orders,
  fn($order) =>  var_dump($order["table"], $order["coffee"])
);