【设计模式与体系结构】创建型模式-建造者模式
简介
建造者模式指的是将一个复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示,分离了部件的构造(由 Builder 负责)和装配(由 Director 负责)。从而可以构造出复杂的对象,这个模式适用于某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序。亦即实现构建算法和装配算法的解耦,实现更好的复用。用户只需要指定复杂对象的类型,而无需知晓其内部构造细节。
建造者模式的角色
- 抽象建造者(Builder)类:定义一套抽象的构建方法接口
- 具体建造者(Concrete Builder)类:实现Builder接口,完成复杂产品的每个部件的具体创建方法。在构建过程完成后,提供产品的实例
- 产品(Product)类:具体创建者要创建的复杂对象
- 指挥者(Director)类:调用具体建造者来建造产品的各个部分,在指挥者中不涉及具体产品的信息,只保证对象的各部分完整创建或按某个顺序创建
建造者模式的优点
- 建造者模式的封装性好,使用建造者模式可以有效地封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的。因此,将主要的业务逻辑封装在指挥者类中,会具有较好的稳定性
- 客户不必知晓产品内部的实现细节。将产品的表示与产品的创建过程解耦,使得相同的创建过程,也可以创建不同的产品,也可以通过控制创建的顺序,来创建不同的产品
- 可以将产品的创建过程精细化,使得业务逻辑更加清晰
- 创建者模式可扩展性好。当有新的业务需求时,仅需要实现一个新的具体建造者类即可,无需更改原有代码,因此符合开闭原则
建造者模式的缺点
- 仅适用于产品类差异较小的情景
建造者模式的类图
正文
Vehicle 类是一个产品类,实际写为一个实体类即可,代码如下:
public class Vehicle { private String frame;//框架 private String power;//能源 public String getPower() { return power; } public void setPower(String power) { this.power = power; } public String getFrame() { return frame; } public void setFrame(String frame) { this.frame = frame; } }
抽象建造者类 VehicleBuilder 代码如下:
public abstract class VehicleBuilder { protected Vehicle vehicle = new Vehicle(); abstract void buildFrame(String frame); abstract void buildPower(String power); }
具体建造者 NewEnergyVehicleBuilder 代码如下:
public class NewEnergyVehicleBuilder extends VehicleBuilder { @Override void buildFrame(String frame) { vehicle.setFrame(frame); } @Override void buildPower(String power) { vehicle.setPower(power); } }
具体建造者 GasolineVehicleBuilder 代码如下:
public class GasolineVehicleBuilder extends VehicleBuilder { @Override void buildFrame(String frame) { vehicle.setFrame(frame); } @Override void buildPower(String power) { vehicle.setPower(power); } }
指挥者 VehicleDirector 代码如下:
public class VehicleDirector { private VehicleBuilder builder; public VehicleDirector(VehicleBuilder builder) { this.builder = builder; } public Vehicle construct(String frame, String power) { builder.buildFrame(frame); builder.buildPower(power); return builder.vehicle; } }
客户端代码如下:
private void testBuilderPattern() { VehicleBuilder builder = new GasolineVehicleBuilder(); VehicleDirector vehicleDirector = new VehicleDirector(builder); Vehicle vehicle = vehicleDirector.construct("铝合金车架", "汽油"); Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower()); builder = new NewEnergyVehicleBuilder(); vehicleDirector = new VehicleDirector(builder); vehicle = vehicleDirector.construct("碳纤维车架", "新能源电池"); Log.i("BuilderPattern", "车架:" + vehicle.getFrame() + " 能源:" + vehicle.getPower()); }
运行效果如下:
合集:
创建型模式
分类:
设计模式与体系结构 / 设计模式
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型