设计模式十: 生成器模式(Builder Pattern)
简介
生成器模式属于创建型模式的一种, 又叫建造者模式.
生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Director).
实现层面上, 产品定义了需要什么样的对象, 具体生成器完成了对象的具体表示. 如果只需要一个具体的构建者,那么抽象生成器角色和指挥者可以省略(如StringBuilder).
意图
将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示.
类图
实现
一. 定义产品
/**
* Car 有很多成员变量, 当然成员可能是一些复杂类型, 这里简化只定义一些基本类型
*/
@Data
public class Car {
private String engine; //发动机
private String chassis; // 底盘
private String body; //车身
private String wheels; //轮子
private String equipment; //构件, 可选
private String radar;// 雷达, 可选
}
二. 定义抽象生成器角色
/**
* 抽象生成器角色,定义每个组件的创建返回类型为本类型, 这样就可以使用链式编程方式了
* 定义了返回最终产品的接口
*/
public abstract class AbstractCarBuilder {
//产品
private Car car = new Car();
protected Car getCar(){
return car;
}
public abstract AbstractCarBuilder setEngine();
public abstract AbstractCarBuilder setChassis();
public abstract AbstractCarBuilder setBody();
public abstract AbstractCarBuilder setWheels();
public abstract AbstractCarBuilder setEquipment();
public abstract AbstractCarBuilder setRadar();
// 返回产品
public Car build(){
return car;
}
}
三. 定义具体的生成器实现,这里定义两个
// 第一个实现
public class BMWCarBuilder extends AbstractCarBuilder {
public AbstractCarBuilder setEngine() {
Car car = this.getCar();
car.setEngine("BMW setEngine");
return this;
}
public AbstractCarBuilder setChassis() {
Car car = this.getCar();
car.setChassis("BMW setChassis");
return this;
}
public AbstractCarBuilder setBody() {
Car car = this.getCar();
car.setBody("BMW setBody");
return this;
}
public AbstractCarBuilder setWheels() {
Car car = this.getCar();
car.setWheels("BMW setWheels");
return this;
}
public AbstractCarBuilder setEquipment() {
Car car = this.getCar();
car.setEquipment("BMW setEquipment");
return this;
}
public AbstractCarBuilder setRadar() {
Car car = this.getCar();
car.setRadar("BMW setRadar");
return this;
}
}
//第二个实现
public class QQCarBuilder extends AbstractCarBuilder {
public AbstractCarBuilder setEngine() {
Car car = this.getCar();
car.setEngine("QQ setEngine");
return this;
}
public AbstractCarBuilder setChassis() {
Car car = this.getCar();
car.setChassis("QQ setChassis");
return this;
}
public AbstractCarBuilder setBody() {
Car car = this.getCar();
car.setBody("QQ setBody");
return this;
}
public AbstractCarBuilder setWheels() {
Car car = this.getCar();
car.setWheels("QQ setWheels");
return this;
}
//没有此组件, 不做任何事情
public AbstractCarBuilder setEquipment() {
return this;
}
//没有此组件, 不做任何事情
public AbstractCarBuilder setRadar() {
return this;
}
}
四. 定义指挥者
/**
* 指挥者角色, 用来定义构建复杂对象的算法
* 这里同时也定义了测试的main方法
*/
public class Director {
private AbstractCarBuilder builder;
public Director(AbstractCarBuilder builder) {
this.builder = builder;
}
public Car BuildCar(){
// 链式构建,并返回最终的结果
return builder
.setWheels()
.setRadar()
.setEngine()
.setChassis()
.setBody()
.setEquipment()
.build();
}
public static void main(String[] args) {
Director director = new Director(new QQCarBuilder());
Car car = director.BuildCar();
System.out.println(car.toString());
director = new Director(new BMWCarBuilder());
car = director.BuildCar();
System.out.println(car.toString());
}
}
总结
如果一个对象需要的成员变量较多, 也就是初始化所需参数过多, 过程比较复杂的话, 那么它就适合使用Builder模式.
优点: 对象分解为组件;将对象构造封装;构造过程可控;
缺点: 增加了类的数量.
与抽象工厂模式的区别: 二者都可以创建复杂对象, 不同的是抽象工厂强调创建一系列的产品对象, 而生成器模式着重于一步步创建一个复杂对象. Builder模式的对象是最后返回的, 抽象工厂的产品是立即返回.
设计模式十: 生成器模式(Builder Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- C#设计模式——生成器模式(Builder Pattern)
一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...
- 【设计模式】- 生成器模式(Builder)
生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 【UE4 设计模式】建造者模式 Builder Pattern
概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- 浅谈设计模式--建造器模式(Builder Pattern)
建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...
随机推荐
- 网络安全实验室--SQL注入关
第一关 万能密码:username='or '1'='1'# password=1 即可登录得到flag. 第二关 最基础的注入,order by 判断字段数,然后 union selec ...
- SQL 无法连接服务器
错误信息:provider:SQL Network Interfaces, error:52-无法定位 LOCA Database Runtime 安装.请验证SQL Server Express是否 ...
- HashMap底层
写在前面: 频繁用到 hashcode() 和 equals() put(key, value): 先计算 key 的hashcode, 找到对应的bucket,如果这个bucket上面已有key-v ...
- 第二部分之RDB持久化(第十章)
RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态.(数据库状态:服务器中的非空数据库以及它们的键值对统称为数据库状态) 一.RDB文件的创建 ...
- python基础概念(转)
基础回顾: 1.集合 集合有2个重要作用:关系测试(并集,差集,交集)和去重. 2.文件编码 2.7上默认文件编码是ASCII码,因为不支持中文,就出了GB2312,在2.7上要支持中文就必须申明文件 ...
- Python——三级菜单
#三级菜单函数 menu = { '北京':{ 海淀:{ '五道口':{} '中关村':{} '上帝':{} } '昌平':{} '朝阳':{} '东城':{} }, '上海':{} '山东':{} ...
- 电脑重装系统后如何恢复 Mysql 数据库
电脑重装系统后如何恢复 Mysql 数据库 一.[设置mysql的path] 比如:我的mysql在:D:\DataBase\mysql-5.7.13-winx64,可以在环境变量中重新新建一个环境变 ...
- XUGUO-书呆子-搜索书箱
WorldCat 上的 米塔斯 通过图书馆馆藏的全球目录WorldCat,在附近的图书馆中查找所要的资料. < 用 Sketch 创作 Airiti Library華藝線上圖書館 BookBub ...
- (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...
- JavaScript中大数相加的解法
一.两个大正整数字符串相加 在JavaScript中,数值类型满足不了大数据容量计算,可以用字符串进行操作 function add(strNum1, strNum2) { // 将传进来的数字/数字 ...