建造者模式和工厂模式很类似,不过添加了一个导演的角色,导演是创建产品的,它负责利用创造者来组建产品并且返回一个产品,但是导演不和产品又具体关系。导演类总体来说是比较灵活不固定的部门,不像产品和创造者那样固定。
一般建造者模式包含四个角色:
Dirextor: 导演(指挥者)类,用于统一组装流程。
Builder:抽象Builder类,规范产品的组建,一般是由子类实现。
ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象
Product: 产品类。
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
应用实例:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
优点:1、建造者独立,易扩展。 2、便于控制细节风险。
缺点:1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景:1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
下边是一个代码示例:
<?php
//产品类,测试数据“程序”
class Program{
public $DataBase;
public $Language;
public function SetDataBase($DataBase)
{
$this->DataBase = $DataBase;
}
public function SetLanguage($Language)
{
$this->Language = $Language;
}
public function ShowInfo()
{
echo "DataBase is ".$this->DataBase." and Language is ".$this->Language;
}
}
//抽象创造者,一般包含创造和返回两个方法,规范产品的组建,一般是由子类实现。
abstract class Builder{
abstract function CreateProgram($DataBase,$Language);
abstract function GetProgram();
}
//创造者,真正实现功能的类,并且返回一个组建好的对象
class ConcreteBuilder extends Builder{
private $Program;
function __construct()
{
$this->Program = new Program();
}
public function CreateProgram($DataBase,$Language)
{
$this->Program->SetDataBase($DataBase);
$this->Program->SetLanguage($Language);
}
public function GetProgram()
{
return $this->Program;
}
}
//导演类,用于统一组装流程
class Director{
private $builder;
function __construct()
{
$this->builder = new ConcreteBuilder();
}
function GetnewProgram($DataBase,$Language)
{
$this->builder->CreateProgram($DataBase,$Language);
return $this->builder->GetProgram();
}
}
$Client = new Director();
$Program = $Client->GetnewProgram("Mysql", "PHP");
$Program->ShowInfo();
?>