PHP의 빌더 패턴에 대한 심층 분석

青灯夜游
풀어 주다: 2023-04-10 11:36:01
앞으로
2598명이 탐색했습니다.

이전 기사 "PHP의 중간 패턴에 대한 간략한 이야기"에서 PHP의 중간 패턴을 소개했습니다. 이 기사에서는 PHP 디자인 패턴의 빌더 패턴을 이해하도록 안내합니다.

PHP의 빌더 패턴에 대한 심층 분석

빌더 모드는 생성기 모드라고도 합니다. 빌더라는 단어의 원래 의미에는 빌더, 개발자, 제작자라는 의미가 포함되어 있습니다. 분명히 이 모드는 객체를 생성하는 데 사용되는 또 다른 생성 모드입니다. 그렇다면 그 특징은 무엇입니까? 건축학적 관점에서 볼 때, 집을 짓는 것은 즉시 지을 수 있는 것이 아니라, 벽돌을 하나씩 쌓아가는 것입니다. 집은 벽돌과 기와뿐만 아니라 각종 파이프, 각종 전선 등으로 구성되어 있고, 그 여러 부분이 모여 집을 이룬다. 빌더 패턴은 다양한 구성 요소로 사물(집)을 구성하는 매우 생생한 과정이라고 할 수 있습니다.

Gof 클래스 다이어그램 및 설명

GoF 정의: 복잡한 객체의 구성을 표현과 분리하여 동일한 구성 프로세스가 다른 표현을 생성할 수 있도록

GoF 클래스 다이어그램

PHP의 빌더 패턴에 대한 심층 분석

code는

class Product
{
    private $parts = [];

    public function Add(String $part): void
    {
        $this->parts[] = $part;
    }

    public function Show(): void
    {
        echo PHP_EOL . '产品创建 ----', PHP_EOL;
        foreach ($this->parts as $part) {
            echo $part, PHP_EOL;
        }
    }
}
로그인 후 복사

제품 클래스를 구현한 것입니다. 우리가 짓고 싶은 집이라고 생각하시면 됩니다. 현재 집에는 아직 콘텐츠가 없으므로 콘텐츠를 추가해야 합니다.

interface Builder
{
    public function BuildPartA(): void;
    public function BuildPartB(): void;
    public function GetResult(): Product;
}

class ConcreteBuilder1 implements Builder
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }

    public function BuildPartA(): void
    {
        $this->product->Add('部件A');
    }
    public function BuildPartB(): void
    {
        $this->product->Add('部件B');
    }
    public function GetResult(): Product
    {
        return $this->product;
    }
}

class ConcreteBuilder2 implements Builder
{
    private $product;

    public function __construct()
    {
        $this->product = new Product();
    }

    public function BuildPartA(): void
    {
        $this->product->Add('部件X');
    }
    public function BuildPartB(): void
    {
        $this->product->Add('部件Y');
    }
    public function GetResult(): Product
    {
        return $this->product;
    }
}
로그인 후 복사

Builder 추상화 및 구현. 개발자마다 항상 서로 다른 브랜드의 재료를 사용합니다. 여기서는 두 명의 개발자가 있지만 그들의 목적은 동일합니다. 집(제품)을 짓는 것입니다.

class Director
{
    public function Construct(Builder $builder)
    {
        $builder->BuildPartA();
        $builder->BuildPartB();
    }
}
로그인 후 복사

Constructor, 제작을 위해 빌더를 호출하는 데 사용됩니다. 맞습니다. 우리 엔지니어링 팀입니다. 자재를 선택하고 제작합니다. 동일한 엔지니어링 팀이 서로 다른 주문을 받을 수 있지만 그들이 짓는 것은 모두 주택입니다. 이 집의 재료와 외관만 다를 뿐, 전반적인 장인의 기술은 여전히 ​​동일합니다.

$director = new Director();
$b1 = new ConcreteBuilder1();
$b2 = new ConcreteBuilder2();

$director->Construct($b1);
$p1 = $b1->getResult();
$p1->Show();

$director->Construct($b2);
$p2 = $b2->getResult();
$p2->Show();
로그인 후 복사

마지막으로 우리의 구현을 살펴보겠습니다. 아주 간단하죠? 엔지니어링 팀을 준비하고, 다양한 빌더를 준비한 후, 제작을 위해 엔지니어링 팀에 넘겨주기만 하면 됩니다! !

  • 사실 이 모델이 해결해야 할 주요 문제는 클래스에 많은 구성과 속성이 있을 수 있다는 점입니다. 이러한 구성과 속성을 모두 하나로 구성해야 하는 것은 아닙니다. 시간 인스턴스화. 이때 이러한 구성과 속성을 언제든지 추가할 수 있는 부분으로 만드는 것을 고려할 수 있습니다. 다양한 속성 조합을 통해 다양한 개체를 가져옵니다.
  • GoF에 있는 위 기사의 원본 텍스트는 다음과 같습니다. 이를 통해 제품의 내부 표현을 변경할 수 있습니다. 구성 코드와 표시 코드를 분리하여 구성 프로세스를 보다 세밀하게 제어할 수 있습니다.
  • 간단히 말하면 물체가 너무 복잡해서 부품별로 조립하면 됩니다!
  • Android 개발에 대해 조금 아시는 분이라면 익숙하실 겁니다. AlterDialog.builder 만들기
  • Laravel에서는 데이터베이스 구성 요소도 빌더 패턴을 사용합니다. DatabaseEloquent에 있는지 확인할 수 있습니다. 및 소스 코드의 DatabaseQuery 디렉토리. 조립 라인의 작업자(감독)는 도면에 따라 액세서리를 사용하여 우리에게 필요한 다양한 모델의 휴대폰(제품)을 생산합니다. 우리 모두가 업계에 활력을 불어넣는 훌륭한 건축자라는 것은 분명합니다! ! !

전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder.php

Example

앞서 언급했듯이 대화 상자 대화 상자가 많이 있습니다. Android에서는 모두 빌더 모델을 사용하여 구현됩니다. 휴대폰 공장의 소유자로서 맞춤형 Android 시스템도 매우 중요한 부분입니다. X Mi와 마찬가지로 우리도 MIUI로 시작하여 소프트웨어 시장에서 먼저 승리하여 모두가 이 시스템이 사용하기 매우 쉽다고 느끼게 한 후 휴대폰 개발을 시작했습니다. 이는 소프트웨어와 하드웨어가 실제로 현대 휴대폰의 가장 중요한 두 가지 구성 요소이며, 어느 것도 그것 없이는 살아남을 수 없음을 보여줍니다. 이번에는 빌더 모드를 사용해 간단하게 다이얼로그 컴포넌트 세트를 구현해보겠습니다!

Dialog 클래스 다이어그램

전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/16.builder/source/builder-dialog.phpPHP의 빌더 패턴에 대한 심층 분석

<?php

class Dialog
{
    private $attributes = [];
    private $buttons = [];
    private $title = &#39;&#39;;
    private $content = &#39;&#39;;

    public function AddAttributes($attr)
    {
        $this->attributes[] = $attr;
    }
    public function AddButtons($button)
    {
        $this->buttons[] = $button;
    }
    public function SetTitle($title)
    {
        $this->title = $title;
    }
    public function SetContent($content)
    {
        $this->content = $content;
    }

    public function ShowDialog(){
        echo PHP_EOL, &#39;显示提示框 === &#39;, PHP_EOL;
        echo &#39;标题:&#39; . $this->title, PHP_EOL;
        echo &#39;内容:&#39; . $this->content, PHP_EOL;
        echo &#39;样式:&#39; . implode(&#39;,&#39;, $this->attributes), PHP_EOL;
        echo &#39;按扭:&#39; . implode(&#39;,&#39;, $this->buttons), PHP_EOL;
    }
}

interface Builder
{
    public function BuildAttribute($attr);
    public function BuildButton($button);
    public function BuildTitle($title);
    public function BuildContent($content);
    public function GetDialog();
}

class DialogBuilder implements Builder{
    private $dialog;
    public function __construct(){
        $this->dialog = new Dialog();
    }
    public function BuildAttribute($attr){
        $this->dialog->AddAttributes($attr);
    }
    public function BuildButton($button){
        $this->dialog->AddButtons($button);
    }
    public function BuildTitle($title){
        $this->dialog->SetTitle($title);
    }
    public function BuildContent($content){
        $this->dialog->SetContent($content);
    }
    public function GetDialog(){
        return $this->dialog;
    }
}

class DialogDirector {
    public function Construct($title, $content){

        $builder = new DialogBuilder();

        $builder->BuildAttribute(&#39;置于顶层&#39;);
        $builder->BuildAttribute(&#39;居中显示&#39;);

        $builder->BuildButton(&#39;确认&#39;);
        $builder->BuildButton(&#39;取消&#39;);

        $builder->BuildTitle($title);
        $builder->BuildContent($content);
        
        return $builder;
    }
}

class ModalDialogDirector {
    public function Construct($title, $content){

        $builder = new DialogBuilder();

        $builder->BuildAttribute(&#39;置于顶层&#39;);
        $builder->BuildAttribute(&#39;居中显示&#39;);
        $builder->BuildAttribute(&#39;背景庶照&#39;);
        $builder->BuildAttribute(&#39;外部无法点击&#39;);

        $builder->BuildButton(&#39;确认&#39;);
        $builder->BuildButton(&#39;取消&#39;);

        $builder->BuildTitle($title);
        $builder->BuildContent($content);
        
        return $builder;
    }
}

$d1 = new DialogDirector();
$d1->Construct(&#39;窗口1&#39;, &#39;确认要执行操作A吗?&#39;)->GetDialog()->ShowDialog();

$d2 = new ModalDialogDirector();
$d2->Construct(&#39;窗口2&#39;, &#39;确认要执行操作B吗?&#39;)->GetDialog()->ShowDialog();
로그인 후 복사

지침

  • 이번 제품은 제목, 내용, 속성, 버튼 등으로 인해 약간 복잡합니다.
  • 구성 과정은 실제로 동일하지만 여기서는 주로 다른 생성자를 사용합니다. 일반 대화 상자 밖의 것들은 클릭이 가능한 반면, 모달 창에는 일반적으로 마스크 레이어가 있어서 배경이 투명하게 검정색이 되고, 밖의 것들은 더 이상 클릭이 불가능하다는 뜻입니다
  • 화될 때마다 구축 메소드를 통해 직접 인스턴스화한다면 window 클래스에는 전달해야 할 매개변수가 많지만 이제 빌더를 통해 이를 결합할 수 있으므로 객체가 다형성 효과를 가지며 다양한 형태와 기능을 제공할 수 있습니다

원본 주소: https: / /juejin.cn/post/6844903981836320781

저자: 하드코어 프로젝트 관리자

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP의 빌더 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿