建造者模式定义:
建造者模式(Builder pattern)是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示, 属于创建型。
适用场景:
1.创建对象需要很多步骤,但是步骤的顺序不一定固定。
2.对象有非常复杂的内部结构。
优点:
封装与扩展优良,将创建于使用分离。建造类之间独立,在一定程度上解耦。
缺点:
1.产生多余的Builder对象。
2.产品内部发生变化则建造者需要随着变化,成本较大。
发现工厂同样是创建对象,现将二者进行对比:
1.建造者更加注重方法的调用顺序,而工厂注重调用对象,什么工厂就创建什么产品。
2.创建对象的力度不同,建造者针对复杂对象,由各种复杂部件组成,而工厂一般不能定制过程,工厂所创建的对象都一样。
3.关注点不一样,工厂只需要把对象创建出来就可以了,而建造者不仅要创建出这个对象,还要知道这个对象由哪些部件组成。
示例:
/**
* 以商品为例: 商品创建之前需要有品牌,店铺,规格等等..,
* 注意商品前置条件的创建是可以没有先后顺序的,但最终却组成了一个完整的商品
*/
@Data
public class Product {
private String brand;
private String shop;
private String spec;
@Override
public String toString() {
return "Product{" +
"brand='" + brand + '\'' +
", shop='" + shop + '\'' +
", spec='" + spec + '\'' +
'}';
}
}
// 商品建造者, 为了节省时间此处没用接口,但在正常开发中建议尽量面向抽象编程
public class ProductBuilder {
private Product product = new Product();
// 方法返回this,方便链式调用,省去每次调用时都需要把对象的引用带上
public ProductBuilder addBrand(String brand){
product.setBrand(brand);
return this;
}
public ProductBuilder addShop(String shop){
product.setShop(shop);
return this;
}
public ProductBuilder addSpec(String spec){
product.setSpec(spec);
return this;
}
public Product builder(){
return product;
}
}
public class MainExcute {
private final static Logger logger = Logger.getLogger(MainExcute.class);
public static void main(String[] args) {
/**
* 使用建造者灵活设值,因为方法的返回值做了优化,因此达到链式调用的写法
*/
ProductBuilder builder = new ProductBuilder()
.addBrand("特步")
.addShop("直营店")
.addSpec("夏季爆款");
logger.info(builder.builder());
/**
* 建造者非常简单, 可自行去参考源码:
* 1.StringBuilder.append()
* 2.Mybatis: CacheBuilder.builder()
*/
}
}
结构:
image.png