定义:
创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使
得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
原理类图:
使用场景:
直接点说就是:
1.当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
2.不同的入参品种组装出来的产品表示不一样
代码示例
例子:
之前遇到一个笔试题:星巴克咖啡价格问题:星巴克咖啡有基本的美式,摩卡,拿铁三种,价格都不一样。同时有很多的配料,包括香草、肉桂、奶油、焦糖、巧克力,每种配料的价格也不一样。一种咖啡可以选多种配料。以OOD的方式来计算每杯咖啡的价格。”
目录
图
这里面client类就是Director,由它来做的组装
package com.sid.builder;
public class Client {
public static void main(String[] args) {
EachCupPrice eachCupPrice = new EachCupPrice
.Builder(new Americano())
.addBatching(new Vanilla())
.addBatching(new Chocolate())
.build();
System.out.println(eachCupPrice.getPrice());
}
}
没有写专门的Builder接口,是直接在EachCupPrice中写的一个静态内部类Builder
而EachCupPrice就是Product产品
package com.sid.builder;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class EachCupPrice {
private Coffee coffee; //必须
private Set<Batching> batchings; //可选
private double price;
public EachCupPrice(Builder builder) {
this.coffee = builder.coffee;
this.batchings = builder.batchings;
this.price = builder.price;
}
public Coffee getCoffee() {
return coffee;
}
public Set<Batching> getBatchings() {
return batchings;
}
public double getPrice() {
return price;
}
public static class Builder {
private Coffee coffee; //必须
private Set<Batching> batchings; //可选
private double price;
public Builder(Coffee coffee) {
this.coffee = coffee;
this.batchings = new HashSet();
}
public Builder addBatching(Batching batching) {
this.batchings.add(batching);
return this;
}
public EachCupPrice build() {
Double batchTotalPrice = batchings.stream().collect(Collectors.summingDouble(x -> ((Batching) x).getPrice()));
this.price = batchTotalPrice+coffee.getPrice();
return new EachCupPrice(this);
}
}
}