以下文字部分均为本人自己的想法与总结所以未必正确;
代码部分摘录自 https://github.com/flyingalex/design-patterns-by-php
建造者模式:
概念:建造者模式(Builder Pattern)也叫做生成器模式,其定义为:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。
适用:当创建复杂对象的过程应该独立于该对象的组成部分以及它们的装配方式时适用。
优点:
1、封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、建造者独立,容易扩展。
3、便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
操作步骤:
1、创建一个建造者抽象类,规定建造者的方法
2、具体建造者实现基本方法
3、导演类选择建造者,然后调用建造者的方法
个人理解:
建造者模式关注的是方法的调用顺序,顺序不同结果不同,建造者模式最主要的功能是基本方法的调用顺序安排,基本方法本身已经实现;而工厂模式则关注零件的创建,基本方法的调用顺序不是它关心的。
假如有客户要买肉,现在四个工人,分别能加工鸡肉、鸭肉、猪肉、牛肉,工厂模式会返回生产者,也就是工人。在建造者模式中,不关心工人怎么来的,也不关心工人怎么生产肉,比如怎么下锅,怎么剁肉(客户不需要懂啊),此时有一个门店老板(也就是导演类),他可以选择让哪个工人干活,也可以命令工人按怎样的顺序干活。
abstract class PersonBuilder
{
abstract public function BuildHead();
abstract public function BuildBody();
abstract public function BuildArmLeft();
abstract public function BuildArmRight();
abstract public function BuildLegLeft();
abstract public function BuildLegRight();
}
class PersonThinBuilder extends PersonBuilder
{
public function BuildHead()
{
echo "小头\n";
}
public function BuildBody()
{
echo "小身子\n";
}
public function BuildArmRight()
{
echo "右臂\n";
}
public function BuildArmLeft()
{
echo "左臂\n";
}
public function BuildLegLeft()
{
echo "左腿\n";
}
public function BuildLegRight()
{
echo "右腿\n";
}
}
class PersonFatBuilder extends PersonBuilder
{
public function BuildHead()
{
echo "大头\n";
}
public function BuildBody()
{
echo "大身子\n";
}
public function BuildArmRight()
{
echo "右臂\n";
}
public function BuildArmLeft()
{
echo "左臂\n";
}
public function BuildLegLeft()
{
echo "左腿\n";
}
public function BuildLegRight()
{
echo "右腿\n";
}
}
class PersonDirector
{
private $personBuilder;
function __construct($personBuilder)
{
$this->personBuilder = $personBuilder;
}
public function CreatePerson()
{
$this->personBuilder->BuildBody();
$this->personBuilder->BuildArmRight();
$this->personBuilder->BuildArmLeft();
$this->personBuilder->BuildLegLeft();
$this->personBuilder->BuildLegRight();
$this->personBuilder->BuildHead();
}
}
//客户端代码
echo "苗条的:\n";
$thinDirector = new PersonDirector(new PersonThinBuilder());
$thinDirector->CreatePerson();
echo "\n胖的:\n";
$fatDirector = new PersonDirector(new PersonFatBuilder());
$fatDirector->CreatePerson();