建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

Ø 优点

1、建造者独立,易扩展。

2、便于控制细节风险。

Ø 缺点

1、产品必须有共同点,范围有限制。

2、如内部变化复杂,会有很多的建造类。

Ø 主要解决

主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

Ø 何时使用

一些基本部件不会变,而其组合经常变化的时候。

Ø 应用场景

1、需要生成的对象具有复杂的内部结构。

2、用户买电脑&电脑组装

Ø 实现

用户A购买电脑A(CPU i5, 内存8G,硬盘1T);

用户B购买电脑B(CPU i3, 内存4G,硬盘500G);

PC产品类Product.php

class Product{  
  
    public $_cpu;  
    public $_memory;  
    public $_hard;  
  
    public function show(){  
        echo "CPU:{$this->_cpu}<br>";  
        echo "内存:{$this->_memory}<br>";  
        echo "硬盘:{$this->_hard}<br>";  
    }  
}  

抽象建造者 Builde.php

abstract class Builder{  
    protected $_pc;  
    function __construct()  
    {  
        $this->_pc = new Product();  
    }  
    abstract public function BuildCpu();  
    abstract public function BuildMemory();  
    abstract public function BuildHard();  
    abstract  public function GetPc();  
}
 

PC制造A:  ContreteBuilderA.php

class ConcreteBuilderA extends Builder{  
    public function BuildCpu(){  
        $this-> _pc ->_cpu = 'i5';  
    }  
  
    public function BuildMemory(){  
        $this -> _pc ->_memory = '8G';  
    }  
  
    public function BuildHard(){  
        $this -> _pc -> _hard = '1T';  
    }  
  
    public function GetPc(){  
        return $this-> _pc;  
    }  
}  

PC制造B:  ContreteBuilderB.php

class ConcreteBuilderB extends Builder{  
    public function BuildCpu(){  
        $this-> _pc ->_cpu = 'i3';  
    }  
  
    public function BuildMemory(){  
        $this -> _pc ->_memory = '4G';  
    }  
  
    public function BuildHard(){  
        $this -> _pc -> _hard = '500G';  
    }  
  
    public function GetPc(){  
        return $this-> _pc;  
    }  
}  

导演类 Director.php

class Director{  
    public function Construct(Builder $builder){  
        $builder ->BuildCpu();  
        $builder ->BuildMemory();  
        $builder ->BuildHard();  
        return $builder->GetPc();  
    }  
} 
 

测试调用:

$director = new App\BuildObj\Director();  
echo 'A用户买了电脑A:<br>';  
$pcA = $director->Construct( new \App\BuildObj\ConcreteBuilderA());  
$pcA ->show();  
echo '------------------<br>';  
echo 'B用户买了电脑B:<br>';  
$pcB = $director->Construct( new \App\BuildObj\ConcreteBuilderB());  
$pcB ->show();  
 

输出结果:

A用户买了电脑A:  
CPU:i5  
内存:8G  
硬盘:1T  
------------------  
B用户买了电脑B:  
CPU:i3  
内存:4G  
硬盘:500G  
评论

0 条评论