建造者者模式,属于创建型模式。
描述
若某种类型的很多类有很多共同点且是必须知道的点,然后有部分相同的属性和部分不同的属性,那么可以用这种模式。
常见实例
1.glide图片框架
2.StringBuilder
3.Retrofit网络框架
常见构建方法
具体代码
package com.elaine.testpattern.builder;
/**
* 常见建造者模式
*
* @auther elaine
*/
public class DefaultProduct {
//产品名字(必填)
private final String productName;
//公司名字(必填)
private final String companyName;
//用户群体(可填)
private final String user;
//备注(可填)
private final String note;
public DefaultProduct(Builder builder) {
this.productName = builder.productName;
this.companyName = builder.companyName;
this.user = builder.user;
this.note = builder.note;
}
public static class Builder {
//产品名字(必填)
private final String productName;
//公司名字(必填)
private final String companyName;
//用户群体(可填)
private String user;
//备注(可填)
private String note;
public Builder(String productName, String companyName) {
this.productName = productName;
this.companyName = companyName;
}
public Builder setUser(String user) {
this.user = user;
return this;
}
public Builder setNote(String note) {
this.note = note;
return this;
}
public DefaultProduct build() {
return new DefaultProduct(this);
}
}
public String getCompanyName() {
return companyName;
}
public String getProductName() {
return productName;
}
public String getUser() {
return user;
}
public String getNote() {
return note;
}
@Override
public String toString() {
return "DefaultProduct{" +
"productName='" + productName + ''' +
", companyName='" + companyName + ''' +
", user='" + user + ''' +
", note='" + note + ''' +
'}';
}
}
运行代码
DefaultProduct defaultProduct = new DefaultProduct.Builder("普通产品", "普通产品公司名")//必传
.setUser("普通产品用户群体")//可选
.setNote("普通产品备注")//可选
.build();
Log.e("defaultProduct==", defaultProduct.toString());
运行结果
经典Builder模式
对象
package com.elaine.testpattern.builder;
/**
* 产品实体
*
* @author elaine
* @date 2020/7/28
*/
public class Product {
//产品名字(必填)
private String productName;
//公司名字(必填)
private String companyName;
//用户群体(可填)
private String user;
//备注(可填)
private String note;
//必传参数的构建方法
public Product(String productName, String companyName) {
this.productName = productName;
this.companyName = companyName;
}
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 getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
@Override
public String toString() {
return "Product{" +
"productName='" + productName + ''' +
", companyName='" + companyName + ''' +
", user='" + user + ''' +
", note='" + note + ''' +
'}';
}
}
抽象构建者类
package com.elaine.testpattern.builder;
/**
* 抽象构建者类
*
* @author elaine
* @date 2020/7/28
*/
public abstract class ProductBuilder {
/**
* 设置用户群体方法
*/
public abstract void setUser();
/**
* 设置备注信息
*/
public abstract void setNote();
/**
* 获取产品对象方法
*
* @return Product
*/
public abstract Product getProduct();
}
实体类
A产品
package com.elaine.testpattern.builder;
/**
* A产品构建类
*
* @author elaine
* @date 2020/7/28
*/
public class AProductBuilder extends ProductBuilder {
private final Product product;
public AProductBuilder(String productName, String companyName) {
this.product = new Product(productName, companyName);
}
@Override
public void setUser() {
product.setUser("A user");
}
@Override
public void setNote() {
product.setNote("A note");
}
@Override
public Product getProduct() {
return product;
}
}
B产品
package com.elaine.testpattern.builder;
/**
* B产品构建类
*
* @author elaine
* @date 2020/7/28
*/
public class BProductBuilder extends ProductBuilder {
private final Product product;
public BProductBuilder(String productName, String companyName) {
this.product = new Product(productName, companyName);
}
@Override
public void setUser() {
product.setUser("B user");
}
@Override
public void setNote() {
product.setNote("B note");
}
@Override
public Product getProduct() {
return product;
}
}
产品指导类
package com.elaine.testpattern.builder;
/**
* 产品指导者类
*
* @author elaine
* @date 2020/7/28
*/
public class ProductDirector {
public void makeProduct(ProductBuilder productBuilder) {
productBuilder.setUser();
productBuilder.setNote();
}
}
使用方法
AProductBuilder aProductBuilder = new AProductBuilder("产品A名称", "产品A公司名");
productDirector.makeProduct(aProductBuilder);
Product aProduct = aProductBuilder.getProduct();
aProduct.setNote("产品A备注内容重写");
Log.e("aProduct==", aProduct.toString());
BProductBuilder bProductBuilder = new BProductBuilder("产品B名称", "产品B公司名");
productDirector.makeProduct(bProductBuilder);
Product bProduct = bProductBuilder.getProduct();
bProduct.setUser("产品B用户群体内容重写");
Log.e("bProduct==", bProduct.toString());