PHP 빌더 패턴
6961 단어 tutorialwebdevphpprogramming
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: 제품
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
Reference
이 문제에 관하여(PHP 빌더 패턴), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bbwithpointers/builder-pattern-em-php-3lc4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)