设计模式-建造者模式
时间:2022年9月21日
本文档摘抄自:菜鸟教程 ,修改部分
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
一、介绍
意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决: 主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用: 一些基本部件不会变,而其组合经常变化的时候。
如何解决: 将变与不变分离开。
关键代码: 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
二、示例
依然选择机器人做为一个例子,这次机器人的组件是头和身体和颜色。
使用建造者模式代码如下:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| @Data public class RobotBody { private String type; private String canDo; }
@Data public class RobotHead { private String type; private String canDo; }
public class Robot { private final String name; private final RobotBody body; private final RobotHead head; private final String color; private Robot(final String name, final RobotBody body, final RobotHead head, final String color) { this.name = name; this.body = body; this.head = head; this.color = color; } public void show(){ System.out.println("我的名称是" + name + ",颜色是" + color); System.out.println("我的头可以:" + head.getCanDo()); System.out.println("我的身体可以:" + body.getCanDo()); } public static class RobotBuilder { private String name; private RobotBody body; private RobotHead head; private String color; RobotBuilder() { } public RobotBuilder name(final String name) { this.name = name; return this; } public RobotBuilder body(final RobotBody body) { this.body = body; return this; } public RobotBuilder head(final RobotHead head) { this.head = head; return this; } public RobotBuilder color(final String color) { this.color = color; return this; } public Robot build() { return new Robot(this.name, this.body, this.head, this.color); } public String toString() { return "Robot.RobotBuilder(name=" + this.name + ", body=" + this.body + ", head=" + this.head + ", color=" + this.color + ")"; } } }
|
三、工厂模式Vs建造者模式
工厂方法模式VS建造者模式
工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。
我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人;而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。
抽象工厂模式VS建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。
建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。
如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。