建造者模式概念
是创建型模式之一,使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个Builder类创建最终对象。
建造者模式解决的问题
建造者模式主要用于解决软件系统中复杂对象的创建问题。例如复杂对象的创建通过各个部分的子对象用一定的算法构成,在需求变化时复杂对象面临大的改变,不利于系统的稳定,
使用建造者将各个部分的算法包装起来,需求变化只需要将算法的顺序以及组合方式改变即可。
一般有以下几个角色
抽象建造者(builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。
指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。
产品(Product):描述一个由一系列部件组成较为复杂的对象。
实例代码:
抽象建造者:
/** * 建造者-抽象类 */ public abstract class AbstractBuilder { /** * 构造颜色 */ abstract void buildColor(); /** * 构造尺寸 */ abstract void buildSize(); /** * 构造重量 */ abstract void buildWeight(); /** * 构造长度 */ abstract void buildLength(); /** * 构造电脑对象 * * @return */ abstract ProductComputer builderComputer(); }
具体建造者(ConcreteBuilder):
/** * 具体建造者 */ public class ConcreteBuilder extends AbstractBuilder { private ProductComputer productComputer; public ConcreteBuilder() { productComputer = new ProductComputer(); } @Override void buildColor() { productComputer.setColor("红色"); } @Override void buildSize() { productComputer.setSize("100*58"); } @Override void buildWeight() { productComputer.setWeight("500g"); } @Override void buildLength() { productComputer.setLength("10028"); } @Override ProductComputer builderComputer() { return productComputer; } }
产品(Product):
/** * 产品 */ public class ProductComputer { private String color; private String size; private String weight; private String length; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public String getLength() { return length; } public void setLength(String length) { this.length = length; } @Override public String toString() { return "ProductComputer{" + "color='" + color + '\'' + ", size='" + size + '\'' + ", weight='" + weight + '\'' + ", length='" + length + '\'' + '}'; } }
指挥者(Director):
/** * 指挥者 */ public class Director { /** * 按照顺序建造产品 * * @param abstractBuilder * @return */ public ProductComputer createProduct(AbstractBuilder abstractBuilder) { abstractBuilder.buildColor(); abstractBuilder.buildSize(); abstractBuilder.buildWeight(); abstractBuilder.buildLength(); return abstractBuilder.builderComputer(); } }
测试代码:
@SpringBootTest class DirectorTest { @Test void Director() { Director director = new Director(); String str2 = director.createProduct(new ConcreteBuilder()).toString(); System.out.println(str2); } }
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决