创建型模式之Builder模式及实现

简介:

建造者(Builder)模式

GOF给出的定义为:建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

应用场景

使用建造者模式是为了将构建复杂对象的过程和它的部件解耦。注意:是解耦过程和部件。

参与角色

建造者模式通常包括以下这几个角色: 1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
4、Product:复杂对象。

如何使用建造者模式

首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示。

首先,需要一个接口,它定义如何创建复杂对象的各个部件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  interface  Builder {
     //创建部件A  比如创建汽车车轮
     void  buildPartA();
     //创建部件B 比如创建汽车方向盘
     void  buildPartB();
     //创建部件C 比如创建汽车发动机
     void  buildPartC();
     
     /**返回最后组装成品结果 (返回最后装配好的汽车)
      * 成品的组装过程不在这里进行,而是转移到下面的Director类中进行
      * 从而实现了解耦过程和部件
      */
     Product getResult();
}

用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),
也就是说Director的内容是如何将部件最后组装成成品:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  Director {
 
     private  Builder builder;
     
     public  Director(Builder builder){
         this .builder=builder;
     }
     
     /** 将部件partA partB partC最后组成复杂对象 */
     public  void  construct(){
         builder.buildPartA();
         builder.buildPartB();
         builder.buildPartC();
     }
}

  

Builder的具体实现ConcreteBuilder:
通过具体完成接口Builder来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口。

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
public  class  ConcreteBuilder  implements  Builder{
     
     private  Product product;
 
     @Override
     public  void  buildPartA() {
         /**
          * 在此创建出部件
          * 把partA传递给product
          */
         PartA partA= new  PartA();
         product.setPartA(partA);
     }
 
     @Override
     public  void  buildPartB() {
         PartB partB= new  PartB();
         product.setPartB(partB);
     }
 
     @Override
     public  void  buildPartC() {
         PartC partC= new  PartC();
         product.setPartC(partC);
     }
 
     @Override
     public  Product getResult() {
         return  product;
     }
     
 
}

 

复杂对象产品:

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
public  class  Product {
 
     private  PartA partA;
     private  PartB partB;
     private  PartC partC;
     
     public  PartA getPartA() {
         return  partA;
     }
     public  void  setPartA(PartA partA) {
         this .partA = partA;
     }
     public  PartB getPartB() {
         return  partB;
     }
     public  void  setPartB(PartB partB) {
         this .partB = partB;
     }
     public  PartC getPartC() {
         return  partC;
     }
     public  void  setPartC(PartC partC) {
         this .partC = partC;
     }
 
}

  

复杂对象的部件:

1
2
3
public  class  PartA {
 
}

  

1
2
3
public  class  PartB {
 
}

  

1
2
3
public  class  PartC {
 
}

  

如何应用:

1
2
3
4
5
6
7
8
9
10
11
12
public  class  Test {
 
     public  static  void  main(){
         
         Builder builder= new  ConcreteBuilder();
         Director director= new  Director(builder);
         director.construct();
         Product product = builder.getResult();
         
         
     }
}

使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。



本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3726840.html,如需转载请自行联系原作者

相关文章
|
Java Android开发 p3c
Alibaba Java Coding Guidelines安装使用教程
Alibaba Java Coding Guidelines安装使用教程
11140 0
Alibaba Java Coding Guidelines安装使用教程
|
负载均衡
OpenFeign重试组件Retryer原理
该文章主要讲解了OpenFeign中的重试组件Retryer的工作原理及其实现细节。
OpenFeign重试组件Retryer原理
|
敏捷开发 开发者
Code Review 全面审查清单
Code Review 全面审查清单
1215 0
Code Review 全面审查清单
|
SQL 缓存 安全
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
14814 2
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
134840 0
|
Java Shell 开发者
都2024年了!你还不知道在Docker中安装jdk?
都2024年了!你还不知道在Docker中安装jdk?
3551 0
|
数据库
阿里数据库内核月报合辑
2015年4月至今的阿里数据库内核月报总集篇
5019 0
|
24天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
34037 135
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
3023 14