建造者模式也称为生成器模式,核心思想是将一个对象的复杂构建与它的表示分离,使他在同样的构建过程可以创建不同的表示。
建造者模式一般认为有四个角色:
1.产品角色,产品角色定义自身的组成属性
2.抽象建造者,抽象建造者定义了产品的创建过程以及如何返回一个产品
3.具体建造者,具体建造者实现了抽象建造者创建产品过程的方法,给产品的具体属性进行赋值定义
4.指挥者,指挥者负责与调用客户端交互,决定创建什么样的产品
(个人理解来说就是用建造者类将需要的对象的具体创建过程封装起来,这样用户在使用的过程中就不会去关注类的创建过程,同时若类的创建过程逻辑发生了变化,用户也不需要取修改自己的代码,因为建造者提供的建造接口是不会被更改的)
以创建一个用户类为例:
要使用用户类的实例,其过程:
1.通过new实例化一个用户类
2.调用用户实例的相关方法,设置实例对象的相关属性
3.经过1、2步骤后,用户实例对象创建完成,此时便可以操作用户实例对象的相关数据
不使用建造者模式:
<?php
/** Date: 18-8-31 Time: 下午9:02*/
class User
{
protected $userName;
protected $userAge;
protected $userHobby;
public function setUserName($userName){
$this->userName=$userName;
}
public function setUserAge($userAge){
$this->userAge=$userAge;
}
public function setUserHobby($userHobby){
$this->userHobby=$userHobby;
}
public function showUserInfo(){
echo "name:".$this->userName." age:".$this->userAge." hobby:".$this->userHobby.PHP_EOL;
}
}
$userName="jhon";
$userAge=2;
$userHobby="Game";
$user=new User();
$user->setUserName($userName);
$user->setUserAge($userAge);
if($userAge<5) {
$user->setUserHobby('用户年龄小于5,不需要设置爱好');
}else{
$user->setUserHobby($userHobby);
}
$user->showUserInfo();
在这里,用户类的实例化以及属性的设置都是客户自己完成的,如果需要修改用户类的属性设置逻辑,则需要客户自己在所有调用了用户类的地方进行修改,当前的代码只有一块,当调用用户类的地方变多后,工作量是巨大的
使用建造者模式
//IBuilder.php
<?php
/** Date: 18-8-31 Time: 下午9:14*/
interface IBuilder
{
public function builder($userInfo);
}
//Builder.php
<?php
/** Date: 18-8-31 Time: 下午9:16*/
class Builder implements IBuilder
{
protected $obj;
public function __construct()
{
$this->obj=new User();
}
public function builder($userInfo)
{
// TODO: Implement builder() method.
$this->obj->setUserName($userInfo['userName']);
$this->obj->setUserAge($userInfo['userAge']);
$this->obj->setUserHobby($userInfo['userHobby']);
return $this->obj;
}
}
//User.php
<?php
/** Date: 18-8-31 Time: 下午9:02*/
class User
{
protected $userName;
protected $userAge;
protected $userHobby;
public function setUserName($userName){
$this->userName=$userName;
}
public function setUserAge($userAge){
$this->userAge=$userAge;
}
public function setUserHobby($userHobby){
$this->userHobby=$userHobby;
}
public function showUserInfo(){
echo "name:".$this->userName." age:".$this->userAge." hobby:".$this->userHobby.PHP_EOL;
}
}
//BuilderDemo.php
<?php
/** Date: 18-8-31 Time: 下午9:20*/
spl_autoload_register(function($className){
include_once $className.'.php';
});
$builder=new Builder();
$user=$builder->builder(['userName'=>'jhon','userAge'=>20,'userHobby'=>'Read']);
$user->showUserInfo();
可以看到,使用建造者模式后,提供给客户的就只有Builder类和创建User类的builder()函数,如果要修改创建逻辑,也只需要更改Builder类,不需要客户进行任何修改。