dream

一个菜鸟程序员的成长历程

0%

设计模式之建造者模式--比工厂更精细的流水线生成

设计模式之建造者模式–比工厂更精细的流水线生成

建造者模式是创建一个稳定流程的复杂对象,隐藏创建的具体流程、过程、细节。

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

为什么要使用建造者模式

当你需要创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化

建造者分离了构建和表示,他把如何创建隐藏了起来,你只要告诉建造者你需要什么,他就会给你建造什么。

建造者模式和工厂模式有什么区别

工厂模式更像一个大工厂,比如口罩工厂负责生产雾霾口罩防毒口罩等等。根据你需要的类型来判断给你什么

雾霾口罩怎么生产呢?假设需要123三个步骤,那么建造者就是负责这三个步骤的,你告诉建造者你需要雾霾口罩,那么他会给你一个完整的,建造好的雾霾口罩而不是口罩半成品

所以建造者更像一个完整的流水线,按照步骤建造好成品给你。

再比如你去饭店点餐,工厂模式是你点哪个菜就给你哪个菜。建造者模式是你点的菜怎么做。你点了鱼香肉丝,建造者会按照步骤,哪一步该放肉,哪一步该放盐,最后做好了把菜给你。

建造者模式还有一个作用就是约束。抽象出的建造流程不可改变,口罩不能少个过滤网,饭菜不能没有放盐。

建造者模式也避免了复杂对象创建流程的缺失。

php实现建造者模式

假设现在有一个对接第三方支付的需求。使用建造者模式。

我们要先抽象出一个建造流程。使用抽象类,对接第三方支付大概需要一个加密,一个读取配置信息,然后把这些参数合并发送出去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

<?php
/**
* 建造者模式
* 建造者抽象类
* 抽象出整个建造流程
*/
abstract class Build {

/**
* 加密流程
*/
public abstract function buildHash();

/**
* 读取配置流程,比如appid这些
*/
public abstract function buildConfig();

}

接下来我们的第三方支付类继承这个抽象建造者来实现具体的第三方支付建造者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 建造者模式
* 建造者抽象类
* 抽象出整个建造流程
*/
class ThreadBuild extends Build{

/**
* 加密流程
*/
public function buildHash() {
//省略加密代码
return 'hash';
}

/**
* 读取配置流程,比如appid这些
*/
public function buildConfig() {
//省略配置代码
return 'config';
}

/**
* 发送http请求流程
*/
public function http() {
//省略发送代码
return 'success';
}
}

有了建造者,我们现在需要一个组装这整个建造流程的监工指挥者。来保证整个流程不出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 建造者模式
* 指挥者类
* 按照流程建造,返回建造后的类。
*/
class Director{
static function createBuild(Build $build) {
$build->buildHash();
$build->buildConfig();
return $build;
}
}

我们的客户端调用。

1
2
3
4

$threadPay = Director::createBuild(new ThreadBuild());
$threadPay->http();

如果接入了别的第三方支付,那么我们只需要增加具体建造者就可以了,如果和抽象建造者冲突,那么说明没有抽象好。在客户端只需要更改具体建造者就可以了。

代码放在了我的github上面。