Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
      • 应用场景
      • 建造者模式的注意事项和细节
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
    • 命令(Command)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2022-04-21
目录

建造者(Builder)模式

# 建造者(Builder)模式

image-20220421173006691

  1. 建造者模式(Builder Pattern) 又叫 生成器模式,是一种对象 构建模式。它可以将复杂对象的建造过程抽象出 来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
  2. 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部的具体构建细节。

创建的东西细节复杂,还必须暴露给使用者。屏蔽过程而不屏蔽细节

产品角色(Product):Phone

/**
 * 只暴露get方法 不暴露set方法
 */
public class Phone {

    protected String cpu;
    protected String mem;
    protected String disk;
    protected String cam;

    public String getCpu() {
        return cpu;
    }

    public String getMem() {
        return mem;
    }

    public String getDisk() {
        return disk;
    }

    public String getCam() {
        return cam;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", mem='" + mem + '\'' +
                ", disk='" + disk + '\'' +
                ", cam='" + cam + '\'' +
                '}';
    }
}
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

抽象建造者(Builder):AbstracPhoneBuilder

public abstract class AbstractBuilder {
    Phone phone;

    abstract void customCpu(String cpu);

    abstract void customMem(String mem);

    abstract void customDisk(String disk);

    abstract void customCam(String cam);

    Phone getProduct() {
        return phone;
    }


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

具体建造者 (Concrete Builder):PhoneBuilder

public class XiaomiBuilder extends AbstractBuilder {
    public XiaomiBuilder() {
        phone = new Phone();
    }

    @Override
    void customCpu(String cpu) {
        phone.cpu = cpu;
    }

    @Override
    void customMem(String mem) {
        phone.mem = mem;
    }

    @Override
    void customDisk(String disk) {
        phone.disk = disk;
    }

    @Override
    void customCam(String cam) {
        phone.cam = cam;
    }
}
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

测试方法:

    public static void main(String[] args) {
        AbstractBuilder builder = new XiaomiBuilder();
        builder.customCpu("骁龙888");
        builder.customCam("一亿");
        builder.customDisk("512G");
        builder.customMem("12G");
    }
1
2
3
4
5
6
7

在建造者模式中常用的链式我们也可以实现,只需将设置属性方法返回自身即可。

抽象建造者:

public abstract class AbstractBuilder2 {
    Phone phone;

    abstract AbstractBuilder2 customCpu(String cpu);

    abstract AbstractBuilder2 customMem(String mem);

    abstract AbstractBuilder2 customDisk(String disk);

    abstract AbstractBuilder2 customCam(String cam);

    Phone getProduct() {
        return phone;
    }


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

具体建造者:

public class XiaomiBuilder2 extends AbstractBuilder2 {
    public XiaomiBuilder2() {
        phone = new Phone();
    }

    @Override
    AbstractBuilder2 customCpu(String cpu) {
        phone.cpu = cpu;
        return this;
    }

    @Override
    AbstractBuilder2 customMem(String mem) {
        phone.mem = mem;
        return this;
    }

    @Override
    AbstractBuilder2 customDisk(String disk) {
        phone.disk = disk;
        return this;
    }

    @Override
    AbstractBuilder2 customCam(String cam) {
        phone.cam = cam;
        return this;

    }
}
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

测试方法:

    public static void main(String[] args) {
        //链式调用
        AbstractBuilder2 builder2 = new XiaomiBuilder2();
        Phone phone2 = builder2.customCpu("天玑9000").customCam("6400万").customMem("12G")
                .customDisk("512G").getProduct();
        System.out.println(phone2);
    }
1
2
3
4
5
6
7

# 应用场景

  • StringBuilder:append (); 给谁 append 呢?
  • Swagger-ApiBuilder:
  • 快速实现。Lombok-Builder 模式

  • 编写代码的时候使用到了设计模式。类 + 模式
    • xxxFactory
    • xxxTemplate
    • xxxBuilder
    • xxxFacede

java.lang.StringBuilder 中的建造者模式

image-20231208202520589

  • Appendable 接口定义了多个 append 方法 (抽象方法), 即 Appendable 为抽象建造者,定义了抽象方法
  • AbstractStringBuilder 实现了 Appendable 接口方法,这里的 AbstractStringBuilder 已经是建造者,只是不能实例化
  • StringBuilder 即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由 AbstractStringBuilder 完成,而 StringBuilder 继承了 AbstractStringBuilder

# 建造者模式的注意事项和细节

  1. 客户端 (使用程序) 不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可 以创建不同的产品对象
  2. 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具 体建造者, 用户使用不同的具体建造者即可得到不同的产品对象
  3. 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰, 也更方便使用程序来控制创建过程
  4. 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭 原则”
  5. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使 用建造者模式,因此其使用范围受到一定的限制。
  6. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因 此在这种情况下,要考虑是否选择建造者模式.
  7. 抽象工厂模式 VS 建造者模式 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采 用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定 的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
工厂(Factory)模式
结构型模式(Structural Pattern)

← 工厂(Factory)模式 结构型模式(Structural Pattern)→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式