====== Приспособленец (Flyweight) ====== ===== Назначение ===== Для уменьшения использования памяти Приспособленец разделяет как можно больше памяти между аналогичными объектами. Это необходимо, когда используется большое количество объектов, состояние которых не сильно отличается. Обычной практикой является хранение состояния во внешних структурах и передавать их в объект-приспособленец, когда необходимо. ===== Код ===== Вы можете найти этот код на [[https://github.com/domnikl/DesignPatternsPHP/tree/main/Structural/Flyweight|GitHub]] Text.php Word.php name, $extrinsicState); } } Character.php name, $extrinsicState); } } TextFactory.php charPool[$name])) { $this->charPool[$name] = $this->create($name); } return $this->charPool[$name]; } private function create(string $name): Text { if (strlen($name) == 1) { return new Character($name); } else { return new Word($name); } } public function count(): int { return count($this->charPool); } } ===== 2.9.4. Тест ===== Tests/FlyweightTest.php characters as $char) { foreach ($this->fonts as $font) { $flyweight = $factory->get($char); $rendered = $flyweight->render($font); $this->assertSame(sprintf('Character %s with font %s', $char, $font), $rendered); } } } foreach ($this->fonts as $word) { $flyweight = $factory->get($word); $rendered = $flyweight->render('foobar'); $this->assertSame(sprintf('Word %s with font foobar', $word), $rendered); } // Flyweight pattern ensures that instances are shared // instead of having hundreds of thousands of individual objects // there must be one instance for every char that has been reused for displaying in different fonts $this->assertCount(count($this->characters) + count($this->fonts), $factory); } }