atwood-pan

 

05-设计模式——建造者(生成器)模式

设计模式——建造者(生成器)模式

生成器Builder

封装一个对象的构造过程,并允许按步骤构造。

LujN60.png

模式定义:

将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示

应用场景

  1. 需要生成的对象具有复杂的内部结构
  2. 需要生成的对象内部属性本身相互依赖
  3. 与不可变对象配合使用

优点

  1. 建造者独立、易扩展
  2. 便于控制细节风险

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

posted on   JavaCoderPan  阅读(11)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

统计

点击右上角即可分享
微信分享提示