PHP 빌더 패턴

O padrão Builder tem como objetivo simplificar a criação de objetos que possuem caracteristicas parecidas, mas valores diferentes em seus atributos e/ou diferentes implementações de métodos.

O Builder encapsula a criação do objeto, ocultando os detalhes de criação, delegando a responsabilidade para outras classes (mais especificas) implementarem a logica.

Builder 프로젝트는 객체를 대표하는 구성 요소를 분리합니다.

문제 상황 - Capítulo 5 do livro Design Patterns :

Atualmente, uma grande empresa que constrói nada menos do
que foguetes espaciais teve a necessidade de um software para a gestão dos seus produtos, e você foi contratado para executar este serviço. O sistema basicamente permitiria o cadastro dos foguetes que a empresa disponibiliza.

Postiormente, os foguetes previamente cadastrados passariam por diversas rotinas de teste através do mesmo sistema usado como catálogo para apresentação e venda.

Cada foguete possui suas 존경하는 성격: 스
modelo, um tipo de motor, tanque de combustível, número de
assentos para os tripulantes, entre uma infinidade de outras
특정 모델의 특성.

Todos os modelos dentro do sistema possuirão uma classe em comum, porém, os atributos de cada um são diferentes e devem ser informados quando criamos cada um dos objetos que os Representativea. 예를 들어 Modelo I possui 3 motores, Modelo II possui 5 모터를 포게트합니다. ou seja, são características specifices de cada um. Além disso, temos uma série de outros atributos que definem suas Representativees.

  • 제품: objeto complexo construido pelo Builder

  • 빌더(생성자): 인터페이스 que serve de contrato das partes do Product

  • Concrete Builder: 제품
  • 에 대한 concreta que constrói 구현

  • Director: 인터페이스 빌더를 사용하여 객체를 구성하는 클래스 응답 정의

  • Começamos definindo nosso objeto complexo:

    
    namespace Builder;
    
    // Objeto complexo que define um foguete
    class FogueteProduct
    {
    
    
        protected float $tanqueCombustivel;
        protected string $modelo;
        protected int $numeroMotores;
        protected int $numeroLugares;
    
        // getters e setters omitidos!!!
    
    }
    


    Em seguida, definimos nossa interface Builder através de uma classe abstrata:

    
    namespace Builder;
    
    // esta é a interface que será extendida pelas outras classes
    abstract class FogueteBuilder
    {
        // sempre que uma classe implementar o Builder, teremos uma instancia de um foguete pronto para uso
        protected FogueteProduct $foguete;
    
        public function __construct()
        {
            $this->foguete = new FogueteProduct();
        }
    
        public function getFoguete():FogueteProduct
        {
            return $this->foguete;
        }
    
        // métodos que serão implementados por outros foguetes, especificando seus atributos variados que os diferem
        abstract public function buildTanqueCombustivel(): void;
        abstract public function buildModelo(): void;
        abstract public function buildMotores(): void;
        abstract public function buildNumeroLugares(): void;
    }
    



    class FogueteModeloIBuilder extends \Builder\FogueteBuilder
    {
    
        // Repare que já possuimos acesso a um objeto do tipo foguete
        public function buildTanqueCombustivel(): void
        {
            $this->foguete->setTanqueCombustivel(1313);
        }
    
        public function buildModelo(): void
        {
            $this->foguete->setModelo('Foguete tipo 1');
        }
    
        public function buildMotores(): void
        {
            $this->foguete->setNumeroMotores(4);
        }
    
        public function buildNumeroLugares(): void
        {
            $this->foguete->setNumeroLugares(13);
        }
    }
    


    중요: Já possuímos uma instância de um foguete, assim como os métodos para criação do mesmo SEM CONHECERMOS verdadeiramente como essa criação é feita.

    Isso não importa para as class que implementarão os modelos, o montador (builder) do foguete não precisa conhecer a criação de cada parte do foguete, apenas implementar a especificação daquele objeto.

    Se criarmos outro foguete, modelo 2:

    class FogueteModeloIIBuilder extends \Builder\FogueteBuilder
    {
    
        // Repare que já possuimos acesso a um objeto do tipo foguete
        public function buildTanqueCombustivel(): void
        {
            $this->foguete->setTanqueCombustivel(850);
        }
    
        public function buildModelo(): void
        {
            $this->foguete->setModelo('Foguete tipo 2');
        }
    
        public function buildMotores(): void
        {
            $this->foguete->setNumeroMotores(54);
        }
    
        public function buildNumeroLugares(): void
        {
            $this->foguete->setNumeroLugares(133);
        }
    }
    


    클래스 추상화 FogueteBuilder를 사용하여 como 인터페이스를 제공합니다. Ela é a garantia para a classe FabricaFoguetesDirector de que todas as classes Builder conterão os métodos que precisamos para montar um foguete.

    $construtorDeFoguetes를 소유하고 있으며 FogueteBuilder의 인스타그램을 사용하여 콘크리트 빌더(Concrete Builder)에 해당합니다.

    use Builder\FogueteProduct;
    
    class FoguetesDirectorFabrica
    {
        protected \Builder\FogueteBuilder $construtorDeFoguetes;
    
        public function __construct(\Builder\FogueteBuilder $construtorDeFoguetes) {
            $this->construtorDeFoguetes = construtorDeFoguetes;
        }
    
        public function getFoguete(): FogueteProduct
        {
            return $this->construtorDeFoguetes->getFoguete();
        }
        public function construirFoguete(): void
        {
            $this->construtorDeFoguetes->buildModelo();
            $this->construtorDeFoguetes->buildMotores();
            $this->construtorDeFoguetes->buildTanqueCombustivel();
            $this->construtorDeFoguetes->buildNumeroLugares();
        }
    
    }
    


    색인 없음 구현:

    <?php 
    
    use Builder\FogueteProduct;
    
    // implementação
    $montadoraDeFoguetesTestI = new Builder\FoguetesDirectorFabrica(new FogueteModeloIBuilder());
    $montadoraDeFoguetesTestII = new Builder\FoguetesDirectorFabrica(new FogueteModeloIIBuilder());
    
    print_r($montadoraDeFoguetesTestI);
    print_r($montadoraDeFoguetesTestII);
    
    $montadoraDeFoguetesTestI->construirFoguete();
    $montadoraDeFoguetesTestI->getFoguete();
    


    Builder의 기본 개체를 단순화하고 개체를 단순화하여 유용하게 수리하십시오.

    Utilizando-o abstraimos a lógica de criação dos objetos, delegando para classes mais especificas implementarem as diferenças de propriedades e métodos(modelos 1 e 2), desta forma, o objeto final instanciado não precisa saber 'como' ele é feito, apenas que deve 페이저

    Código do post: https://github.com/bbwithpointers/design-patterns-php

    좋은 웹페이지 즐겨찾기