23种设计模式-建造者模式
概述
将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示
- 分离了部件的构造和装配。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况
- 由于实现了构建和装配的解耦。不同的构建器、相同的装配,也可以做出不同的对象;想通的构建器、不同的装配顺序也可以做出不同的对象,也就是实现了构建算法、装配算法的解耦,实现了更好的复用
- 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部的具体构造细节
结构
建造者模式包含如下角色:
- 抽象建造者类(Builder):这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建
- 具体建造者类(ConcreteBuilder):实现
Builder
接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例 - 产品类(Product):要创建的复杂对象
- 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指挥者中不涉及具体产品的信息,只保证对象各个部分完整创建或按某种顺序创建
实现
/**
* 抽象建造者
*/
abstract class MobileBuilder
{
protected $mobile;
abstract public function setName();
abstract public function setDate();
abstract public function createMobile();
abstract public function getMobile();
}
/**
* 抽象产品
*/
interface Mobile
{
public function setName($name);
public function getName();
public function setDate($date);
public function getDate();
}
/**
* 具体产品
*/
class RedmiK70 implements Mobile
{
protected $name;
protected $date;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setDate($date)
{
$this->date = $date;
}
public function getDate()
{
return $this->date;
}
}
/**
* 具体产品
*/
class HuaweiNova12 implements Mobile
{
protected $name;
protected $date;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function setDate($date)
{
$this->date = $date;
}
public function getDate()
{
return $this->date;
}
}
/**
* 具体建造者
* 红米产品
*/
class Redmi extends MobileBuilder
{
public function setName()
{
// 设置手机名称
$this->mobile->setName('红米K70');
return $this;
}
public function setDate()
{
$this->mobile->setDate('2023');
return $this;
}
public function createMobile()
{
$this->mobile = new RedmiK70();
return $this;
}
public function getMobile():Mobile
{
return $this->mobile;
}
}
/**
* 具体建造者
* 华为产品
*/
class Huawei extends MobileBuilder
{
public function setName()
{
// 设置手机名称
$this->mobile->setName('华为Nova12');
return $this;
}
public function setDate()
{
$this->mobile->setDate('2023');
return $this;
}
public function createMobile()
{
$this->mobile = new HuaweiNova12();
return $this;
}
public function getMobile():Mobile
{
return $this->mobile;
}
}
/**
* 指挥者
*/
class Director
{
public function build(MobileBuilder $build)
{
$build->createMobile();
$build->setName();
$build->setDate();
return $build->getMobile();
}
}