Java结构型设计模式中建造者模式示例详解
作者:丨Jack_Chen丨 发布时间:2023-04-24 13:37:31
建造者模式
概述
建造者模式(Builder Pattern)属于创建型模式。
它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象。
建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离。
JDK的StringBuilder类中append()方法,提供了开放构造步骤,最后调用toString0方法就可以获得一个构造好的完整字符串。其就是一个建造者模式的体现。
角色
建造者模式提供四个主要角色:
1.产品(Product)
要创建的产品类对象。
2.建造者抽象(Builder)
建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。
3.建造者(ConcreteBuilder)
具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。
4.调用者(Director)
调用具体的建造者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保正对象各部分完整创建或按某种顺序创建。
优缺点
优点:
1.封装性好,创建和使用分离。
2.扩展性好,建造类之间独立、一定程度上解耦。
缺点:
1.产生多余的Builder对象。
2.产品内部发生变化,建造者都要修改,成本较大。
应用场景
1.需要生成的对象具有复杂的内部结构。
2.需要生成的对象内部属性本身相互依赖。
3.相同的方法,不同的执行顺序,产生不同的结果。
4.当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。
基本使用
生产一辆Car的过程,需要一系列的步骤,假设这些步骤可以随意调整组合。
创建产品类
public class Car {
/**
* 名称
*/
private String name;
/**
* 颜色
*/
private String color;
/**
* 价格
*/
private String price;
/**
* 类型
*/
private String type;
/**
* 发动机
*/
private String engine;
/**
* 轮子
*/
private String wheel;
}
创建建造者类
创建建造者类,将复杂的构造过程封装起来,构造步骤由使用者决定
public class CarBuilder {
private Car car = new Car();
public CarBuilder addName(String name) {
car.setName(name);
return this;
}
public CarBuilder addColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder addPrice(String price) {
car.setPrice(price);
return this;
}
public CarBuilder addType(String type) {
car.setType(type);
return this;
}
public CarBuilder addEngine(String engine) {
car.setEngine(engine);
return this;
}
public CarBuilder addWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public Car build() {
return car;
}
}
使用
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
Car car = carBuilder.addName("奔驰")
.addColor("红色")
.addPrice("100万")
.addType("轿车")
.addEngine("1.8T")
.addWheel("18寸")
.build();
System.out.println(car);
}
链式写法
建造者模式通常是采用链式编程的方式构造对象。
具体做法:
将产品类添加到建造者类中作为内部类,然后将构造步骤添加进去,完成每个步骤,都返回this关键字。
创建产品类与建造者类
public class CarBuilder {
@Data
public class Car {
/**
* 品牌
*/
private String name;
/**
* 颜色
*/
private String color;
/**
* 价格
*/
private String price;
/**
* 类型
*/
private String type;
/**
* 发动机
*/
private String engine;
/**
* 轮子
*/
private String wheel;
}
private Car car = new Car();
public CarBuilder addName(String name) {
car.setName(name);
return this;
}
public CarBuilder addColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder addPrice(String price) {
car.setPrice(price);
return this;
}
public CarBuilder addType(String type) {
car.setType(type);
return this;
}
public CarBuilder addEngine(String engine) {
car.setEngine(engine);
return this;
}
public CarBuilder addWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public Car build() {
return car;
}
}
使用
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
carBuilder.addName("奔驰").addColor("红色").addPrice("100万").addType("跑车").addEngine("发动机").addWheel("轮子");
CarBuilder.Car car = carBuilder.build();
System.out.println(car);
}
来源:https://blog.csdn.net/qq_38628046/article/details/126087259


猜你喜欢
- @EventListener 异步中使用condition的问题@EventListener是spring在4.2+推出的更好的使用spri
- public string NextString(int charLowerBound, int charUpperBound, int l
- 1. kotlin 数值型fun main() { // 整数型 val a: Byte
- Java Comparable 和 Comparator 的详解及区别Java 中为我们提供了两种比较机制:Comparable 和 Com
- 最近在做保证金余额查询优化,在项目启动时候需要把余额全量加载到本地缓存,因为需要全量查询所有骑手的保证金余额,为了不影响主数据库的性能,考虑
- 这篇文章主要介绍了Java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
- 本文实例讲述了Java实现的求逆矩阵算法。分享给大家供大家参考,具体如下:package demo;public class MatrixI
- 【一】背景6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理,我
- 以下通过3个知识点给大家讲解了上拉加载和下拉刷新的Fragment实现的方法,在对每个知识点介绍了一下用法。1.效果预览1.1.这个首页就是
- 一.问题1.HashSet,TreeSet是如何使用hashCode()和equal()方法的2.TreeMap,TreeSet中的对象何时
- 前文传送门:Netty分布式FastThreadLocal的set方法实现逻辑剖析recycler的使用这一小节开始学习recycler相关
- 前言RabbitMQ 是使用 Erlang 语言开发的消息中间件, 其遵循了高级消息队列协议(Advanced Message Queuin
- 前言本文主要演示一个普通 java 项目导入IDEA的流程步骤及可能出现的问题、原因及解决办法。本文使用的部分软件版本如下:IDEA 201
- 实例如下:import java.util.concurrent.CountDownLatch;import java.util.concu
- Android获取系统cpu信息,内存,版本,电量等信息 1、CPU频率,CPU信息:/proc/cpuinfo和/proc/stat 通过
- 目录Demo展示介绍计时器功能Unity计时器Demo展示介绍游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法;一般实现有一
- 包含默认敏感词过滤和自定义敏感词过滤。导入依赖<dependency> <groupId>com.git
- 之前的工作中,需要实现一个功能就是GridView中的item可以自由拖动, 思考了一下,其实实现起来不是很困难,主要工作就是交换节点,以及
- 引入字体首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件,如:...flutter:
- 背景大家在使用Selenium + Chromedriver爬取网站信息的时候,以为这样就能做到不被网站的反爬虫机制发现。但是实际上很多参数