05-设计模式——建造者(生成器)模式
设计模式——建造者(生成器)模式
生成器Builder:
封装一个对象的构造过程,并允许按步骤构造。
模式定义:
将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示
应用场景:
- 需要生成的对象具有复杂的内部结构
- 需要生成的对象内部属性本身相互依赖
- 与不可变对象配合使用
优点:
- 建造者独立、易扩展
- 便于控制细节风险
V1复杂版本
package com.example.designpatterns.builder.v1; import lombok.Data; /** * @program: DesignPatterns * @description: 构造者模式 V1-复杂版本 * @author: Coder_Pan * @create: 2022-04-13 10:01 **/ public class BuilderTest { public static void main(String[] args) { DefaultConcreateProductBuilder defaultConcreateProductBuilder = new DefaultConcreateProductBuilder(); Director director = new Director(defaultConcreateProductBuilder); Product product = director.makeProduct("螺蛳粉", "panpan", "p1", "p2", "p3", "p4"); System.out.println(product); System.out.println("-------------------------------------------------------------------"); NewConcreateProductBuilder newBuilder = new NewConcreateProductBuilder(); Director director1 = new Director(newBuilder); Product product1 = director.makeProduct("new螺蛳粉", "panpan", "p1", "p2", "p3", "p4"); System.out.println(product1); } } /** * 定义构建者模式 */ interface ProductBuilder { /** * 创建对象 * @return */ Product build(); /** * builderProductName * @param productName */ void builderProductName(String productName); /** * builderCompanyName * @param companyName */ void builderCompanyName(String companyName); /** * buildPart1 * @param part1 */ void buildPart1(String part1); /** * buildPart2 * @param part2 */ void buildPart2(String part2); /** * buildPart3 * @param part3 */ void buildPart3(String part3); /** * buildPart4 * @param part4 */ void buildPart4(String part4); } /** * 创建构造者模式实现类 * * 默认 => Default */ class DefaultConcreateProductBuilder implements ProductBuilder { /** * 若干个属性 */ private String productName; private String companyName; private String part1; private String part2; private String part3; private String part4; @Override public Product build() { return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4); } @Override public void builderProductName(String productName) { this.productName = productName; } @Override public void builderCompanyName(String companyName) { this.companyName = companyName; } @Override public void buildPart1(String part1) { this.part1 = part1; } @Override public void buildPart2(String part2) { this.part2 = part2; } @Override public void buildPart3(String part3) { this.part3 = part3; } @Override public void buildPart4(String part4) { this.part4 = part4; } } /** * 另外一个产品构造器 * * 可以使用另外一种建造方式 */ class NewConcreateProductBuilder implements ProductBuilder { /** * 若干个属性 */ private String productName; private String companyName; private String part1; private String part2; private String part3; private String part4; @Override public Product build() { return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4); } @Override public void builderProductName(String productName) { this.productName = productName; } @Override public void builderCompanyName(String companyName) { this.companyName = companyName; } @Override public void buildPart1(String part1) { this.part1 = part1; } @Override public void buildPart2(String part2) { this.part2 = part2; } @Override public void buildPart3(String part3) { this.part3 = part3; } @Override public void buildPart4(String part4) { this.part4 = part4; } } /** * 定义一个导向器 */ class Director { private ProductBuilder builder; /** * 通过构造函数将构造者传入 * * @param builder */ public Director(ProductBuilder builder){ this.builder = builder; } /** * 控制构造顺序 */ public Product makeProduct(String productName, String companyName, String part1, String part2, String part3, String part4){ builder.builderProductName(productName); builder.builderCompanyName(companyName); builder.buildPart1(part1); builder.buildPart2(part2); builder.buildPart3(part3); builder.buildPart4(part4); Product build = builder.build(); return build; } } /** * 定义一个产品对象 => Product * * 通过lombok简化get、set方法 */ @Data class Product { /** * 若干个属性 */ private String productName; private String companyName; private String part1; private String part2; private String part3; private String part4; //.....若干个属性 /** * 空参构造 */ public Product(){ } /** * 全参构造 * @param productName * @param companyName * @param part1 * @param part2 * @param part3 * @param part4 */ public Product(String productName, String companyName, String part1, String part2, String part3, String part4){ this.productName = productName; this.companyName = companyName; this.part1 = part1; this.part2 = part2; this.part3 = part3; this.part4 = part4; } }
V2-精简版本
package com.example.designpatterns.builder.v2; import lombok.Data; /** * @program: DesignPatterns * @description: 构造者模式 V2-精简版本 ==> 链式编程 * @author: Coder_Pan * @create: 2022-04-13 10:33 **/ public class ProductTestV2 { public static void main(String[] args) { Product product = new Product.Builder() //链式调用..... .productName("XXXX") .companyName("123p_p") .part1("1111") .part2("2222") .part3("3333") .part4("4444") .build();//通过build,最终生成实例 System.out.println(product); } } /** * 定义一个产品对象 => Product * * 通过lombok简化get、set方法 */ @Data class Product { /** * 若干个属性 * final => 在构建的时候才会将真实的值传入,传入之后就不能再次修改了..... */ private final String productName; private final String companyName; private final String part1; private final String part2; private final String part3; private final String part4; //.....若干个属性 /** * 全参构造 * @param productName * @param companyName * @param part1 * @param part2 * @param part3 * @param part4 */ public Product(String productName, String companyName, String part1, String part2, String part3, String part4){ this.productName = productName; this.companyName = companyName; this.part1 = part1; this.part2 = part2; this.part3 = part3; this.part4 = part4; } /** * 定义静态内部构造器 * */ static class Builder { /** * 若干个属性 */ private String productName; private String companyName; private String part1; private String part2; private String part3; private String part4; public Builder productName(String productName){ this.productName = productName; return this; } public Builder companyName(String companyName){ this.companyName = companyName; return this; } public Builder part1(String part1){ this.part1 = part1; return this; } public Builder part2(String part2){ this.part2 = part2; return this; } public Builder part3(String part3){ this.part3 = part3; return this; } public Builder part4(String part4){ this.part4 = part4; return this; } /** * * @return product实例 */ Product build(){ //校验操作 Product product = new Product(this.productName, this.companyName, this.part1, this.part2, this.part3, this.part4); return product; } } }
StringBuilder
以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。
public class AbstractStringBuilder { protected char[] value; protected int count; public AbstractStringBuilder(int capacity) { count = 0; value = new char[capacity]; } public AbstractStringBuilder append(char c) { ensureCapacityInternal(count + 1); value[count++] = c; return this; } private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity); } void expandCapacity(int minimumCapacity) { int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity; if (newCapacity < 0) { if (minimumCapacity < 0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } value = Arrays.copyOf(value, newCapacity); } }
public class StringBuilder extends AbstractStringBuilder { public StringBuilder() { super(16); } @Override public String toString() { // Create a copy, don't share the array return new String(value, 0, count); } }
public class Client { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); final int count = 26; for (int i = 0; i < count; i++) { sb.append((char) ('a' + i)); } System.out.println(sb.toString()); } }
JDK
- java.lang.StringBuilder
- java.nio.ByteBuffer
- java.lang.StringBuffer
- java.lang.Appendable
- [Apache Camel builders](
posted on 2022-04-13 10:57 JavaCoderPan 阅读(11) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南