Шаблон прототипа в PHP

В этом шаблоне созданные объекты служат своего рода прототипом, который будет клонироваться для создания новых объектов. В отличие от других паттернов создания, паттерн Prototype использует сам объект для создания новых экземпляров вместо того, чтобы использовать для этого вспомогательные классы.

Этот шаблон в основном используется, когда вы хотите создать
точные копии объекта, включая его атрибуты. Таким образом, мы получаем гораздо меньшие затраты памяти, чем при многократном инстанцировании одного и того же объекта.

Представьте, что книжному магазину необходимо «подписать» имя покупателя на обложке каждой книги. Если бы мы использовали подход без шаблонов, нам пришлось бы создавать новый объект для каждой купленной книги, верно?

Все эти вычислительные «усилия» только для того, чтобы изменить одно свойство объекта.

Для этого давайте воспользуемся паттерном Prototype, который дает нам гораздо более легкое решение этой проблемы.

  • Прототип: абстрактный класс, определяющий контракт, который будет «клонирован».
  • Конкретный тип: конкретный класс, реализующий прототип.
  • Клиент: классы, которые используют объекты. _
LivroPrototype: 

/**
 * Livro Design Patterns PHP 7
 *  Pagina 73 
 * O objetivo desse padrão é definir alguns objetos que servem
 *como uma instância de protótipo, clonada para a criação de novos
 *objetos. Diferente dos demais padrões de criação, o Prototype
 *utiliza o próprio objeto para criar as novas instâncias em vez de
 *usar classes auxiliares para fazer isso.
 *Este padrão é indicado principalmente quando se quer criar
 *cópias exatas de um objeto, incluindo seus atributos. Assim, temos
 *um custo muito menor de memória do que instanciar o mesmo
 *objeto muitas vezes e, em cada uma dessas vezes, setar exatamente
 *os mesmos valores em suas propriedades. 
 */

namespace Prototype;

abstract class LivroPrototype
{
    protected string $titulo;
    // método mágico __clone() é chamaod quando clonamos uma classe com a palavra clone - de forma abstrata, a implementação deve ser feita nas subclasses
    abstract public function __clone();

    public function  getTitulo(): string
    {
        return $this->titulo;
    }

    public function setTitulo(string $titulo) : LivroPrototype 
    {
        $this->titulo = $titulo;
        return $this;
    }
}

Войдите в полноэкранный режим Выход из полноэкранного режима

Класс BookPrototype представляет наш прототип. Это
расширяет абстрактный класс BookPrototype, наследуя его свойства и методы.

class LivroPhpPrototype extends LivroPrototype
{
    public function __construct()
    {
        $this->setTitulo("Livro PHP");
    }

    public function __clone()
    {
        echo "Livro PHP Clonadon";
    }
}

Войдите в полноэкранный режим Выход из полноэкранного режима

Ниже приведен код клиента:

// CLIENTES 

$compradores = ['Gabriel', 'Anderson', 'Bruno'];

$livroPhp = new LivroPhpPrototype();
$livroPhp->setTitulo("Padroes de projeto em PHP");
print_r($livroPhp);

// criando vários clones 

$livros = [];
foreach($compradores as $nomeComprador)
{
    $livroComprador = clone $livroPhp;
    $livroComprador->setNome($nomeComprador);
    $livros[] = $livroComprador; 
}
print_r($livros);

Войдите в полноэкранный режим Выход из полноэкранного режима

Благодаря этому наш книжный магазин теперь может генерировать сотни книг с подписками, потребляя гораздо меньше памяти, чем решение без прототипа.

Важно отметить, что в последнем цикле мы всегда работаем с клоном уже инстанцированного объекта, изменяя только имя, которое будет «подписано» в книге.

Репозиторий с кодом: https://github.com/bbwithpointers/design-patterns-php

Оцените статью
devanswers.ru
Добавить комментарий