Проблема:
Требуется добавить большой объем данных в базу данных, при условии что мы используем ORM.
Решение:
[file: BookPrototype.php] — абстрактный класс, который будет клонировать другие объекты которые являются прототипом BookPrototype(наследуют данный абстрактный класс).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php abstract class BookPrototype { protected $title; abstract public function __clone(); public function getTitle(): string { return $this->title; } } |
[file: BarBookPrototype.php] — тип книги «Bar», которые наследуют прототип книги
1 2 3 4 5 6 7 8 9 10 11 |
<?php class BarBookPrototype extends BookPrototype { protected $title = 'Bar'; public function __clone() { } } |
[file: FooBookPrototype.php] — тип книги «Foo», которые наследуют прототип книги
1 2 3 4 5 6 7 8 9 10 |
<?php class FooBookPrototype extends BookPrototype { protected $title = 'Foo'; public function __clone() { } } |
Применение
1 2 3 4 5 6 7 8 9 10 11 12 |
$fooPrototype = new FooBookPrototype(); $barPrototype = new BarBookPrototype(); for ($i = 0; $i < 10; $i++) { $book = clone $fooPrototype; $book->getTitle(); } for ($i = 0; $i < 5; $i++) { $book = clone $barPrototype; $book->getTitle(); } |
Минусы:
Объекты клонируются в текущем состоянии, в котором и были созданы(допустим с теми же установленными свойствами что были установлены при инициализации). Об этом стоит постоянно помнить. Для обнуления свойств объекта можно использовать встроенный метод __clone().
Плюсы:
Помогает избежать затрат на создание объектов стандартным способом (new Foo()), а вместо этого создаёт прототип и затем клонирует его.
Источник: https://designpatternsphp.readthedocs.io/ru/latest/Creational/Prototype/README.html
Комментарии закрыты!