/**
* @authoer:ChenGuoAo
* @createDate:2022/10/8
* @description: 理解多层级 建造者
* 如果遇到类的构造方法或静态工厂具有多个参数的时候可以考虑
* 与构造器相比 优势在于参数灵活,相对于javaBeans 更加安全,便于扩展、阅读和编写
*/
public abstract class Pizza {
// 定义基础属性
public enum Topping{HAM,MUSHROOM,ONION,PEPPER,SAUSAGE}
Set<Topping> toppings;
abstract static class Builder<T extends Builder<T>> {
EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);
// 通过Builder 给属性赋值
public T addTopping(Topping topping){
toppings.add(Objects.requireNonNull(topping));
return self();
}
// 返回对象 由子类实现
protected abstract T self();
// 调用构建方法
abstract Pizza build();
}
Pizza(Builder<?> builder) {
toppings = builder.toppings;
}
}
/**
* @authoer:ChenGuoAo
* @createDate:2022/10/8
* @description: 子类实现建造者,添加拓展参数
*/
class MyPizza extends Pizza {
// 添加披萨大小属性
public enum Size { SMALL,MEDIUM,LARGE}
private final Size size;
// 添加其他属性
private final boolean other;
// 子类实现构建类
public static class Builder extends Pizza.Builder<Builder>{
private final Size size;
private boolean other= false;
// 返回当前对象
@Override
protected Builder self() {
return this;
}
public Builder other() {
this.other= true;
return self();
}
@Override
Pizza build() {
return new MyPizza(this);
}
public Builder(Size size) {
this.size = Objects.requireNonNull(size);
}
}
private MyPizza(Builder builder) {
super(builder);
size = builder.size;
other= builder.other;
}
@Override
public String toString() {
return "MyPizza{" +
"toppings=" + toppings +
", size=" + size +
", insize=" + insize +
'}';
}
public static void main(String[] args) {
Pizza build = new MyPizza.Builder(Size.SMALL).addTopping(Topping.ONION).addTopping(Topping.PEPPER).insize().build();
System.out.println("build = " + build);
}
}
【设计模式】建造者模式理解
最新推荐文章于 2024-08-22 17:07:09 发布