建造者模式(Builder)
介绍
创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
建造者模式一般认为有四个角色:
A、产品角色,产品角色定义自身的组成属性
B、抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
C、具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
D、指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
优点:
A、建造者独立,易扩展。
B、便于控制细节风险。
缺点:
A、产品必须有共同点,范围有限制。
B、如内部变化复杂,会有很多的建造类。
代码实现:
<?php
// 产品角色
class User{
protected $name = '';
protected $age = '';
protected $sex = '';
public function setName($name){
$this->name = $name;
}
public function setAge($age){
$this->age = $age;
}
public function setSex($sex){
$this->sex = $sex;
}
public function getUser(){
echo '这个人姓名是:' . $this->name
. ',年龄是:' . $this->age
. ',性别是:' . $this->sex .'。<br>';
}
}
// 抽象建造者
interface UserBuilder{
public function builderName();
public function builderAge();
public function builderSex();
public function getUser();
}
// 具体建造者
class CommonBuilder implements UserBuilder{
public $user;
public function __construct(){
$this->user = new User();
}
public function builderName(){
$this->user->setName('普通用户');
}
public function builderAge(){
$this->user->setAge('20');
}
public function builderSex(){
$this->user->setSex('男');
}
public function getUser(){
return $this->user;
}
}
// 具体建造者
class SupperBuilder implements UserBuilder{
public $user;
public function __construct(){
$this->user = new User();
}
public function builderName(){
$this->user->setName('超级用户');
}
public function builderAge(){
$this->user->setAge('30');
}
public function builderSex(){
$this->user->setSex('女');
}
public function getUser(){
return $this->user;
}
}
// 指挥者
class UserDirector{
public function make(UserBuilder $builder){
$builder->builderName();
$builder->builderAge();
$builder->builderSex();
return $builder->getUser();
}
}
$director = new UserDirector();
$commonBuilder = new CommonBuilder();
$commonUser = $director->make($commonBuilder);
$commonUser->getUser();
$supperBuilder = new SupperBuilder();
$supperUser = $director->make($supperBuilder );
$supperUser->getUser();