建造者模式,先来看下定义:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
简单地说,需要创建的对象都有自己的功能,但是创建方式是一样的,那么可以用建造者类来负责功能对象的创建。
类图如下:
Builder模式中主要角色
- 抽象建造者(Builder)角色:定义抽象接口,规范产品各个部分的建造,必须包括建造方法和返回方法。
- 具体建造者(Concrete)角色:实现抽象建造者接口。应用程序最终根据此角色中实现的业务逻辑创造产品。
- 导演者(Director)角色:调用具体的建造者角色创造产品。
- 产品(Product)角色:在导演者的指导下所创建的复杂对象。
ConcreteBuilder类负责创建产品类对象,而Director类则负责产品类具体功能构建。如果需要修改产品的功能,只需要在ConcreteBuilder类实现新方法,并由Director类调用即可。对客户端来说是透明的,不需要关心。
比如,现在大家去买安卓手机,主要关心软件和硬件,比较商家的操作系统和硬件设备。
<?php
interface phone {
public function buildSoftware();
public function buildHardware();
}
class createPhone implements phone {
private $_phone;
public function __construct() {
$this->_phone = new Zuk();
}
public function buildSoftware() {
$this->_phone->setSoftware('安卓系统');
}
public function buildHardware() {
$this->_phone->setHardware('四核8G内存');
}
public function getResult() {
return $this->_phone;
}
}
//我用的手机是ZukZ2
class Zuk {
private $_software;
private $_hardware;
public function setSoftware($software) {
$this->_software = $software;
}
public function setHardware($hardware) {
$this->_hardware = $hardware;
}
public function getSoftware() {
return $this->_software;
}
public function getHardware() {
return $this->_hardware;
}
}
class Director {
public function __construct(CreatePhone $createphone) {
$createphone->buildSoftware();
$createphone->buildHardware();
}
}
//client
$createPhone = new CreatePhone();
new Director($createPhone);
$myphone = $createPhone->getResult();
echo $myphone->getSoftware();
echo $myphone->getHardware();
最后总结:
优点:建造者模式将一个对象的实现与其“业务”逻辑分离开来,便于功能修改和扩展。
缺点:建造者接口修改后,所有执行类也需要进行修改。