建造者模式(Bulider模式)
建造者模式(Bulider模式)
模式定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
该模式的主要优点如下:
- 各个具体的建造者相互独立,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
模式的结构与实现:
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成
1. 模式的结构
建造者(Builder)模式的主要角色如下。
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
java代码实现v1:
public class BuilderTest {
public static void main(String[] args) {
// ProductBuilder defaultConcreteProductBuilder = new DefaultConcreteProductBuilder();
ProductBuilder specialConcreteProductBuilder = new SpecialConcreteProductBuilder();
Director director = new Director(specialConcreteProductBuilder);
Product product = director.makeProduct("bzzb2", "com.noob", "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();
}
//具体创建者1--默认
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.part2,this.part3,this.part4);
}
}
//具体创建者2
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.part2,this.part3,this.part4);
}
}
//指挥者
class Director{
private ProductBuilder 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.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, String 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 + '\'' +
'}';
}
}
java代码实现v2:--内部类方式
public class BuilderTest2 {
public static void main(String[] args) {
Product build = new Product.Builder().productName("bzzb").companyName("com.itnoob").part1("part1").part2("part2").build();
System.out.println(build);
}
}
class Product {
private final String productName;
private final String companyName;
private final String part1;
private final String part2;
private final String part3;
private final String 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;
}
Product build(){
Product product = new Product(this.productName, this.companyName, this.part1, this.part2, this.part3, this.part4);
return product;
}
}
@Override
public String toString() {
return "Product{" +
"productName='" + productName + '\'' +
", companyName='" + companyName + '\'' +
", part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3='" + part3 + '\'' +
", part4='" + part4 + '\'' +
'}';
}
}