프로토타입 패턴 em PHP

Neste padrão os objetos criados servem como uma espécie de protótipo, que serão clonados 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 class 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.

que uma livraria precisa 'assinar' o nome do comprador em cada capa de livro를 상상해보세요. Se fossemos por uma abordagem sem padrões, teriamos que instanciar um novo objeto a cada livro comprado, certo?

Todo esse 'esforço'computacional somente parar alterar uma propriedade do objeto.

Para isso, vamos utilizar o padrão Prototype que nos da uma solução muito mais leve para esse problema.

  • 프로토타입: classe abstrata que define o contrato a ser 'clonado'

  • 구체적인 유형: 프로토타입을 구체적으로 구현하는 클래스입니다.

  • 클라이언트: class que fazem uso dos objetos.
    _

  • 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;
        }
    }
    
    

    Classe LivroPrototype은 새로운 프로토타입을 나타냅니다. 엘라
    estende da classe abstrata LivroPrototype, herdando assim suas propriedades e métodos.

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


    Abaixo, o código dos clientes:

    // 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);
    
    


    com isso, a nossa livraria agora pode gerar centenas de livros com assinatura, consumindo muito menos memória que uma solução sem o prototype.

    É 중요한 관찰자 que no ultimo 루프, estamos trabalhando semper com um clone do objeto já instanciado, motificando apenas o nome que seria 'assinado' no livro.

    코드 저장소: https://github.com/bbwithpointers/design-patterns-php

    좋은 웹페이지 즐겨찾기