构建者模式,旨在将一个复杂的对象的构建过程与其表示分离,是的同样的构建过程可以创建出不同的表示。也就是说,隐藏创建对象的过程以及细节,在用户不知对象创建过程和细节的情况下,直接创建复杂的对象。
其组成模型如下:
| 组成 | 作用 |
|---|---|
| Builder(抽象构造器) | 提供创建产品的所需流程,对应为接口方法 |
| ConcreteBuilder(具体构造器) | 实现各个部件的创建并组装,并提供一个生产最终产品的方法 |
| Director(指导者) | 使用Builder接口,呈现出一个统一创建产品的过程 |
| Product(产品) | 表示需要生产的复杂的对象,包含了多个部件 |
构建者模式的优点
- 易于解耦;将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象
- 易于精确控制对象的创建;将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
- 易于拓展;增加新的具体建造者无需修改原有类库的代码,易于拓展,符合开闭原则
构建者模式的缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
构建者模式最佳实践
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
构建者模式实现步骤
- 创建Director,负责将具体的产品划分为不同的部件;
- 创建Builder,定义产品的每个部件;
- 创建ConcreteBuilder,赋予每个部件的具体实现;
- 创建出最终的产品Product;
构建者模式实现示例
实现一个系统,产品经理会下发需求,陈述该系统由哪几个模块组成,并将需求转交给团队Leader。Leader拿到需求之后,将之下发给开发实现,最终实现一个完整的系统。
在这里:
- Director就是产品经理;
- Builder就是团队Leader;
- ConcreteBuilder就是开发;
- Product就是该系统
public class Builder {public interface IBuilder {// 登录模块void login();// 商城模块void mall();// 支付模块void pay();// 订单模块void order();// 组建系统MallSystem build();}public static class SystemBuilder implements IBuilder {private MallSystem system = new MallSystem();@Overridepublic void login() {system.create("编写登录模块");}@Overridepublic void mall() {system.create("编写商城模块");}@Overridepublic void pay() {system.create("编写支付模块");}@Overridepublic void order() {system.create("编写订单模块");}@Overridepublic MallSystem build() {return system;}}public static class ProductManager {public void createSystem(IBuilder builder) {builder.login();builder.mall();builder.order();builder.pay();}}public static class MallSystem {private StringBuilder sb = new StringBuilder();public void create(String step) {sb.append(step);sb.append("\n");}public void showStep() {System.out.println(sb.toString());}}public static void main(String[] args) {// 创建产品经理,决定这个商城系统需要分为这些模块ProductManager productManager = new ProductManager();IBuilder builder = new SystemBuilder();productManager.createSystem(builder);// 展示系统的组成MallSystem build = builder.build();build.showStep();}}
打印结果如下:
**
:::success
编写登录模块
编写商城模块
编写订单模块
编写支付模块
:::
