持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。
建造者模式
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
1.需要生成的对象具有复杂的内部结构
2.需要生成的对象内部属性本身相互依赖
3.与不可变对象配合使用
角色
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
代码演示
public class BuilderTest {
public static void main(String[] args) {
Product product=new Product( );
product.setCompanyName( "xxx" );
product.setPart1( "xxx" );
ProductBuilder specialConcreteProductBuilder=new SpecialConcreteProductB uilder();
Director director=new Director(specialConcreteProductBuilder);
Product product=director.makeProduct( "productNamexxx", "cn...", "part1", "part2", "part3", "part4" );
System.out.println(product);
}
}
interface ProductBuilder{
void builderProductName(String productName);
void builderCompanyName(String companyName);
void builderPart1(String part1);
void builderPart2(String part2);
void builderPart3(String part3);
void builderPart4(String part4);
Product build();
}
}
class DefaultConcreteProductBuilder implements ProductBuilder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
@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 void builderPart3(String part3) {
this.part3=part3;
}
@Override
public void builderPart4(String part4) {
this.part4=part4;
}
@Override
public Product build() {
return new Product( this.productName,this.companyName,this.part1,this.pa rt2,this.part3,this.part4 );
}
}
class SpecialConcreteProductBuilder implements ProductBuilder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
@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 void builderPart3(String part3) {
this.part3=part3;
}
@Override
public void builderPart4(String part4) {
this.part4=part4;
}
@Override
public Product build() {
return new Product( this.productName,this.companyName,this.part1,this.p art2,this.part3,this.part4 );
}
}
class Director{
private ProductBuilder builder;
public Director(ProductBuilder builder) {
this.builder=builder;
}
public Product makeProduct(String productName, String companyName, Stri ng part1, String part2, String part3, String part4){
builder.builderProductName(productName );
builder.builderCompanyName(companyName );
builder.builderPart1(part1 );
builder.builderPart2(part2 );
builder.builderPart3(part3 );
builder.builderPart4(part4 );
Product product=builder.build();
return product;
}
}
class Product {
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
public Product() {
}
public Product(String productName, String companyName, String part1, St
ring part2, String part3, String part4) {
this.productName=productName;
this.companyName=companyName;
this.part1=part1;
this.part2=part2;
this.part3=part3;
this.part4=part4;
}
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;
}
public String getPart3() {
return part3;
}
public void setPart3(String part3) {
this.part3=part3;
}
public String getPart4() {
return part4;
}
public void setPart4(String part4) {
this.part4=part4;
}
@Override
public String toString() {
return "Product{" +
"productName='" + productName + '\'' +
", companyName='" + companyName + '\'' +
", part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3='" + part3 + '\'' +
", part4='" + part4 + '\'' +
'}';
}
}
优缺点
优点:
封装性好,客户端不必知道内部产品的实现细节。 建造者独立,容易扩展。 便于控制细节风险。
缺点:
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
JDK源码中的应用:
1 org.springframework.web.servlet.mvc.method.RequestMappingInfo
2 org.springframework.beans.factory.support.BeanDefinitionBuilder
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。