建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
应用场景:
- 需要生成的对象具有复杂的内部结构;
- 需要生成的对象内部属性本身相互依赖;
- 与不可变对象配合使用;
模式:Builder模式可以将一个类的构建和表示进行分离,使得同样的构建过程可以创建不同的表示
在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
在spring 的应用:org.springframework.web.reactive.result.method.RequestMappingInfo
public class BuilderTest {
public static void main(String[] args) {
ProductBuiler productBuiler = new ContrProductBuilder();
Director director = new Director(productBuiler);
Product builder = director.createBuilder("productName", "companyName", "part1", "part2");
System.out.println(builder);
}
}
class Director{
private ProductBuiler productBuiler;
public Director(ProductBuiler productBuiler){
this.productBuiler=productBuiler;
}
public Product createBuilder(String productName, String companyName, String part1, String part2){
productBuiler.builderProductName(productName);
productBuiler.builderCompanyName(companyName);
productBuiler.builderPart1(part1);
productBuiler.builderPart2(part2);
Product builder = productBuiler.builder();
return builder;
}
}
// 具体 builder 类
class ContrProductBuilder implements ProductBuiler{
String productName;
String companyName;
String part1;
String part2;
@Override
public void builderProductName(String productName) {
this.productName=productName;
}
@Override
public void builderCompanyName(String companyName) {
this.companyName=companyName;
}
@Override
public void builderPart1(String part1) {
this.part1=part1;
}
@Override
public void builderPart2(String part2) {
this.part2=part2;
}
@Override
public Product builder() {
return new Product(productName,companyName,part1,part2);
}
}
interface ProductBuiler{
void builderProductName(String productName);
void builderCompanyName(String companyName);
void builderPart1(String part1);
void builderPart2(String part2);
Product builder();
}
class Product{
String productName;
String companyName;
String part1;
String part2;
public Product(){}
public Product(String productName, String companyName, String part1, String part2) {
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
}
public String getProductName() {return productName;}
public void setProductName(String productName) { this.productName = productName;}
public String getCompanyName() { return companyName;}
public void setCompanyName(String companyName) {this.companyName =companyName;}
public String getPart1() { return part1;}
public void setPart1(String part1) { this.part1 = part1; }
public String getPart2() {return part2;}
public void setPart2(String part2) {this.part2 = part2; }
@Override
public String toString() {
return "Product{" +
"productName='" + productName + '\'' +
", companyName='" + companyName + '\'' +
", part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
'}';
}
}