喜迎
春节

设计模式——建造者模式


说明

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。首先看下关系图:

示例

下面讲解下设计模式的代码实现

  1. 创建产品类
     class Product{
         private $parts = [];
         public function add(string $part): void{
             $this->parts[] = $part;
         }
         public function show():void{
             print_r($this->parts);
         }
     }
    
  2. 创建建造者接口
     interface Builder{
         public function buildPartA(): void;
         public function buildPartB(): void;
         public function getResult(): Product;
     }
    
  3. 创建多个建造者实现类

     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;
         }
     }
    
  4. 创建构造器

     class Director{
         public function construct(Builder $builder){
             $builder->buildPartA();
             $builder->buildPartB();
         }
     }
    
  • 我们来测试下:

      class FactoryTest{
          public static function index(){
              $director = new Director();
              $builder1 = new ConcreteBuilder1();
              $builder2 = new ConcreteBuilder2();
    
              $director->construct($builder1);
              $product1 = $builder1->getResult();
              $product1->show();
    
              $director->construct($builder2);
              $product2 = $builder2->getResult();
              $product2->show();
          }
      }
    
  • 输出结果为:

    Array ( [0] => 部件A [1] => 部件B )
    Array ( [0] => 部件X [1] => 部件Y )
    

总结

它与工厂模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建复合对象,多个部分。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Linux下curl命令
Linux下curl命令
格式curl https://www.baidu.com 上面命令向www.baidu.com发出 GET 请求,服务器返回的内容会在命令行输出。 常用参数-d:使用-d参数向服务器发送POST请求的数据体curl -d 'login=ad
2022-07-04
下一篇 
PHP实现方法运行前(后)执行指定的程序
PHP实现方法运行前(后)执行指定的程序
在PHP中,利用__call(),可实现方法运行前/后执行指定的程序片段。 下面演示下,在test方法执行后自动执行afterTest方法 trait A{ public function __call($method, $args
2022-06-02
  目录