建造者模式(Builder Pattern):优雅地构建复杂对象
创作时间:
作者:
@小白创作中心
建造者模式(Builder Pattern):优雅地构建复杂对象
引用
CSDN
1.
https://blog.csdn.net/weixin_45970964/article/details/144257779
在软件开发中,我们常常遇到需要创建复杂对象的场景。当一个对象有多个属性,且这些属性的组合可能非常多样时,传统的构造函数或工厂模式可能会显得笨拙。这就是建造者模式(Builder Pattern)发挥作用的地方。
建造者模式的核心概念
建造者模式是一种创建型设计模式,它能够将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包含以下关键角色:
- 产品类(Product):最终要创建的复杂对象
- 抽象建造者(Builder):定义创建产品各个部件的抽象接口
- 具体建造者(ConcreteBuilder):实现抽象建造者,负责具体的构建过程
- 指挥者(Director):控制构建过程,但不直接涉及产品的细节
代码示例:以计算机配置为例
建造者模式计算机配置示例
// 产品角色(Product):计算机类
public class Computer {
// 产品的复杂属性
private String cpu; // CPU
private String memory; // 内存
private String mainBoard; // 主板
private String hardDisk; // 硬盘
private String displayCard; // 显卡
// 私有构造方法,只能通过建造者创建
private Computer(ComputerBuilder builder) {
this.cpu = builder.cpu;
this.memory = builder.memory;
this.mainBoard = builder.mainBoard;
this.hardDisk = builder.hardDisk;
this.displayCard = builder.displayCard;
}
@Override
public String toString() {
return "Computer{" +
"CPU='" + cpu + '\'' +
", 内存='" + memory + '\'' +
", 主板='" + mainBoard + '\'' +
", 硬盘='" + hardDisk + '\'' +
", 显卡='" + displayCard + '\'' +
'}';
}
// 抽象建造者(Builder)接口:定义构建电脑各个部件的抽象接口
public interface ComputerBuilder {
// 定义构建各个部件的抽象方法
ComputerBuilder cpu(String cpu);
ComputerBuilder memory(String memory);
ComputerBuilder mainBoard(String mainBoard);
ComputerBuilder hardDisk(String hardDisk);
ComputerBuilder displayCard(String displayCard);
// 最终构建方法
Computer build();
}
// 具体建造者(ConcreteBuilder):游戏电脑建造者
public static class GamingComputerBuilder implements ComputerBuilder {
// 具体建造者内部持有一个产品实例
private String cpu;
private String memory;
private String mainBoard;
private String hardDisk;
private String displayCard;
@Override
public GamingComputerBuilder cpu(String cpu) {
this.cpu = cpu;
return this;
}
@Override
public GamingComputerBuilder memory(String memory) {
this.memory = memory;
return this;
}
@Override
public GamingComputerBuilder mainBoard(String mainBoard) {
this.mainBoard = mainBoard;
return this;
}
@Override
public GamingComputerBuilder hardDisk(String hardDisk) {
this.hardDisk = hardDisk;
return this;
}
@Override
public GamingComputerBuilder displayCard(String displayCard) {
this.displayCard = displayCard;
return this;
}
@Override
public Computer build() {
return new Computer(this);
}
}
// 指挥者(Director):电脑配置指导类
public static class ComputerDirector {
// 指挥者使用建造者构建复杂对象
public static Computer createHighEndGamingComputer(ComputerBuilder builder) {
return builder
.cpu("Intel i9-13900K")
.memory("64GB DDR5")
.mainBoard("ASUS ROG Maximus")
.hardDisk("2TB PCIe 4.0 SSD")
.displayCard("NVIDIA RTX 4090")
.build();
}
public static Computer createOfficeComputer(ComputerBuilder builder) {
return builder
.cpu("Intel i5-13600K")
.memory("16GB DDR4")
.mainBoard("ASUS Pro WS")
.hardDisk("1TB SSD")
.displayCard("Integrated Graphics")
.build();
}
}
// 客户端使用示例
public static void main(String[] args) {
// 使用具体建造者创建游戏电脑
Computer gamingPC = new Computer.ComputerDirector()
.createHighEndGamingComputer(new GamingComputerBuilder());
// 使用具体建造者创建办公电脑
Computer officePC = new Computer.ComputerDirector()
.createOfficeComputer(new GamingComputerBuilder());
System.out.println("游戏电脑配置:" + gamingPC);
System.out.println("办公电脑配置:" + officePC);
}
}
可以使用内部类的方式:
// 产品类:计算机
class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String displayCard;
public Computer(ComputerBuilder builder) {
this.cpu = builder.cpu;
this.memory = builder.memory;
this.hardDisk = builder.hardDisk;
this.displayCard = builder.displayCard;
}
@Override
public String toString() {
return "Computer{" +
"CPU='" + cpu + '\'' +
", 内存='" + memory + '\'' +
", 硬盘='" + hardDisk + '\'' +
", 显卡='" + displayCard + '\'' +
'}';
}
// 建造者内部类
public static class ComputerBuilder {
private String cpu;
private String memory;
private String hardDisk;
private String displayCard;
public ComputerBuilder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public ComputerBuilder memory(String memory) {
this.memory = memory;
return this;
}
public ComputerBuilder hardDisk(String hardDisk) {
this.hardDisk = hardDisk;
return this;
}
public ComputerBuilder displayCard(String displayCard) {
this.displayCard = displayCard;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
// 使用示例
public class BuilderDemo {
public static void main(String[] args) {
Computer gamingComputer = new Computer.ComputerBuilder()
.cpu("Intel i9")
.memory("32GB")
.hardDisk("1TB SSD")
.displayCard("NVIDIA RTX 3080")
.build();
System.out.println(gamingComputer);
}
}
建造者模式 vs 工厂模式
主要区别
- 目的不同:
- 工厂模式主要关注对象的创建
- 建造者模式关注复杂对象的分步骤构建
- 构建灵活性:
- 工厂模式通常一次性创建完整对象
- 建造者模式允许逐步配置对象,更加灵活
- 使用场景:
- 工厂模式适合创建简单对象
- 建造者模式适合创建有多个部件,且配置复杂的对象
典型应用场景
- 构建复杂的配置对象
- 需要创建不可变对象
- 对象有大量可选参数
- 构建过程相对固定,但细节可变
优缺点分析
优点
- 将复杂对象的构建和表示解耦
- 提供更精细的控制构建过程
- 链式调用使代码更加清晰
缺点
- 会增加代码的复杂度
- 对于简单对象可能会显得过度设计
结语
建造者模式是构建复杂对象的利器,它通过将对象构建的复杂逻辑封装起来,提供了一种优雅且灵活的对象创建方式。
热门推荐
外贸人新年祝福大作战:搞定客户的心
红军长征走过的泸州 四通八达的路网串起革命老区红色遗址
2024年中国红色旅游发展报告:融合创新推动产业高质量发展
红军长征走过的泸州 四通八达的路网串起革命老区红色遗址丨长征路上看四川
托辊知识全解析:种类、制造与选择指南
复兴号:从“追赶者”到“领跑者”的创新之路
潍烟高铁带你打卡山东5A景区
海南东线旅游攻略:从亚龙湾到五指山的瑰丽之旅
高效与环保并存:探索高分子托辊的前沿应用
东阳托辊加工生产线的原理是什么?
家常炸麻花的和面技巧,金黄酥脆,让人回味无穷
有订单号如何查快递单号 快递查询方法 最新教程
美国最新车牌更换攻略:从申请到领取全攻略
忻州美食打卡,吃货们的福音!
5G时代,VoLTE让你通话更清晰
忻州最美自然景观推荐:五台山、雁门关、芦芽山、万年冰洞
忻州打卡圣地:五台山、雁门关、四十九温泉民宿
探访忻州古城墙:1800年的历史见证者
滨江森林公园:夏夜里的萤火虫与王莲
萤火虫:生态系统的守护精灵
付新华揭秘萤火虫发光之谜:20年研究发现关键基因
华农揭秘萤火虫发光秘密,助力生态保护
打卡重庆冰天雪地|武隆仙女山:林海雪原成童话世界
武隆仙女山玩雪住宿攻略(价格+电话)
杭州出发:重庆仙女山景区门票价格详解
牛群近况:75岁独居"贫民窟",从相声大师到普通居民
牛群:从相声巨星到独居老人,一位艺术家的曲折人生
自制油条,1碗面能做3大筐,步骤详细简单,蓬松酥脆
应急科普365 | 健康吃油条,做到这3点
酥掉渣的国风点心,粉嫩精美超好看,比包子馒头高级,做法还简单