【设计模式】- 生成器模式(Builder)
生成器模式
建造者模式、Builder
生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象。在该模式中允许你使用相同的创建代码生成不同类型和形式的对象。

生成器的结构模式

- 生成器(Builder)接口声明在所有类型生成器中通用的产品构造的步骤
- 具体的生成器(ConcreteBuilders)提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
- 产品 (Products) 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
- 主管 (Director) 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。
- 客户端 (Client) 必须将某个生成器对象与主管类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。
案例分析
下面我们将结合一辆汽车的制造过程来模拟一个构建构成。针对汽车这种非常复杂的机械结构,我们需要将汽车各个零部件的组装过程抽取到不同的代码中,最终组成一个完成的产品。下面我们将简化这个过程,模拟一辆汽车的车型产品,命名,颜色喷漆,产品定价等信息。

核心类解释
- 抽象出一个汽车产品
Car。 - 定义
Builder接口,规定Car的构建步骤和过程。 CarBuilder实现类。CarDirectror统一构建过程。
代码实现
Car.class
public class Car {
/**
* 车型 SUV MVP 轿车等
*/
private String type;
/**
* 汽车颜色
*/
private String color;
/**
* 奥迪 啥的
*/
private String name;
/**
* 售价
*/
private BigDecimal price;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"type='" + type + '\'' +
", color='" + color + '\'' +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
Builder.class
public interface Builder {
/**
* 定义车型
* @param type
* @return
*/
Builder buildType(String type);
/**
* 定义产品名称
* @param name
* @return
*/
Builder buildName(String name);
/**
* 确定颜色喷漆
* @param color
* @return
*/
Builder buildColor(String color);
/**
* 定价
* @param bigDecimal
* @return
*/
Builder buildPrice(BigDecimal bigDecimal);
/**
* 返回
* @return
*/
Car build();
}
CarBuilder.class
public class CarBuilder implements Builder{
private final Car car = new Car();
@Override
public Builder buildColor(String color) {
car.setColor(color);
return this;
}
@Override
public Builder buildType(String type) {
car.setType(type);
return this;
}
@Override
public Builder buildName(String name) {
car.setName(name);
return this;
}
@Override
public Builder buildPrice(BigDecimal bigDecimal) {
car.setPrice(bigDecimal);
return this;
}
@Override
public Car build() {
return car;
}
}
这里的处理方式只是做解释,其实还是可以进一步抽象CarBuilder到具体车型的Builder,并在次基础上添加一些验证的功能
CarDirector.class
public class CarDirector {
public void mpvCarBuilder(Builder builder){
builder.buildName("奥迪");
builder.buildType("mpv");
builder.buildColor("red");
builder.buildPrice(new BigDecimal("400000.00"));
}
public void suvCarBuilder(Builder builder){
builder.buildName("奥迪");
builder.buildType("suv");
builder.buildColor("black");
builder.buildPrice(new BigDecimal("300000.00"));
}
}
Client.class
public class Client {
@Test
public void builderMvp(){
CarDirector carDirector = new CarDirector();
Builder builder = new CarBuilder();
carDirector.mpvCarBuilder(builder);
System.out.println(builder.build().toString());
}
@Test
public void buildSuv(){
CarDirector carDirector = new CarDirector();
Builder builder = new CarBuilder();
carDirector.suvCarBuilder(builder);
System.out.println(builder.build().toString());
}
}
总结
在日常开发中我们能经常用到Builder设计模式,最常见的就是核心程序中的StringBuilder了,在开源框架中我们也经常能够看到,例如Mybatis中的SqlSourceBuilder、XMLConfigBuilder等等信息
为了灵活构造复杂对象,该对象会有多个成员变量,在外部调用的时候,不需要或者不方便一次性创建出所有的成员变量,在这种情况下,使用多个构造方法去构建对象,很难维护,这时候Builder设计模式解决这个问题,进行buid()方法中创建对象,并且将builder传入,该builder中,维护了传入对象的成员变量。
【设计模式】- 生成器模式(Builder)的更多相关文章
- C#设计模式——生成器模式(Builder Pattern)
一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...
- 第9月第6天 push pop动画 生成器模式(BUILDER)
1. https://github.com/MichaelHuyp/QQNews 2.生成器模式(BUILDER) class MazeBuilder { public: virtual void B ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...
- javascript设计模式-生成器模式(Builder)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- 设计模式-生成器(Builder)
一.概念 将一个复杂对像的构建与它的表示分离,使得同样的构建过程创建不同的表示,又叫建造模式. 生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用.采用不同的构建实现,产生不 ...
- 生成器模式Builder
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11406502.html 1. 定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...
- TypeScript实现设计模式——生成器模式
生成器模式是一种在TypeScript/JavaScript中非常常见的创建型设计模式,它使你能够分步骤创建复杂对象.当你需要创建一个可能有许多配置选项的对象时, 该模式会特别有用. 问题 假设我们需 ...
随机推荐
- macOS 屏幕共享, 远程协助
macOS 屏幕共享, 远程协助 Screen Sharing App 隐藏 app bug command + space 搜索 https://macflow.net/p/397.html Tea ...
- CORS & OPTIONS & preflight request
CORS & OPTIONS preflight request CORS 原理 CORS跨域的原理实际上是浏览器与服务器通过一些HTTP协议头来做一些约定和限制 OPTIONS 应用场景 h ...
- 「NGK每日快讯」2021.1.15日NGK公链第73期官方快讯!
- Python算法_排序数组(09)
给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1]输出:[1,2,3,5] 示例 2: 输入:nums = [5,1,1,2,0,0]输出:[0,0 ...
- c#winform主题实现的一个方法
winform的主题实现没有bs里面那么舒服,下面做了一个简单实现,记录一下. 1.一个接口,需要做主题的控件.窗体都要实现这个接口 /// <summary> /// 使用主题的控件.窗 ...
- Java后台防止客户端重复请求、提交表单
前言 在Web / App项目中,有一些请求或操作会对数据产生影响(比如新增.删除.修改),针对这类请求一般都需要做一些保护,以防止用户有意或无意的重复发起这样的请求导致的数据错乱. 常见处理方案 1 ...
- 零基础学Python:数据容器
1.常用操作 列表常用操作 在 ipython 中定义一个 列表,例如: l= list() 输入 l. 按下 TAB 键, ipython 会提示 字典 能够使用的函数如下: 可以到官方网址查询使用 ...
- 多Excel文件内容查询工具。
多Excel文件内容查询工具. 告别繁琐重复的体力劳动,一分钟干完一天的活. 码云 github 下载 当需要在多个Excel表格中查询需要的信息是,一个文件一个文件的去查询非常麻烦. 虽然有其他方法 ...
- MySQL 异常有这一篇就够了!
摘要:在本文中,总结了开发过程中最为常见的几种 MySQL 抛出的异常以及如何解决,包括高版本驱动的问题.时区配置问题.SSL 连接问题等,是一篇经验总结贴. 前言 在本文中,总结了开发过程中最为常见 ...
- HDOJ-6641(欧几里得+异或运算)
TDL HDOJ-6641 关于题意,就是要找出符合f的第m大的数,而且后面还要满足异或等式. 通过观察题目,可以发现n太大了,所以不能直接枚举.当然因为m比较小,所以可以转换思路k^n,这个数最大不 ...