一、介绍
系统中一个对象的创建牵扯到很多方面的因素,在创建过程中设置不同的条件会得到不同的结果对象输出,为了封装对象创建的实现细节,可以考虑使用建造者模式。
二、UML类图
建造者模式定义接口类IMilkTeaBuilder,规范产品MilkTea的制作步骤buildMilk、buildTea、buildWater等,创建两个实现类HotMilkTeaBuilder和IceMilkTeaBuilder具体实现制作不同MilkTea的细节,根据buildeWater是加入不同温度的水实现热奶茶、冰奶茶的制作,MilkTeaProducer是MilkTea生产商,负责和外部、Builder对接,让外部调用者和Buidler解耦,同时隐藏制作过程细节,不对外暴露。
三、代码示例
Builder接口
public interface IMilkTeaBuilder {
void buildMilk();
void buildTea();
void buildWater();
MilkTea build();
}
Builder实现者
public class HotMilkTeaBuilder implements IMilkTeaBuilder {
private final MilkTea milkTea = new MilkTea();
@Override
public void buildMilk() {
System.out.println("制作奶茶——放入牛奶");
milkTea.setMilk("牛奶");
}
@Override
public void buildTea() {
System.out.println("制作奶茶——放入茶");
milkTea.setMilk("茶");
}
@Override
public void buildWater() {
System.out.println("制作奶茶——放入热水");
milkTea.setMilk("热水");
}
@Override
public MilkTea build() {
System.out.println("奶茶制作完成");
return milkTea;
}
}
public class IceMilkTeaBuilder implements IMilkTeaBuilder {
private final MilkTea milkTea = new MilkTea();
@Override
public void buildMilk() {
System.out.println("制作奶茶——放入牛奶");
milkTea.setMilk("牛奶");
}
@Override
public void buildTea() {
System.out.println("制作奶茶——放入茶");
milkTea.setMilk("茶");
}
@Override
public void buildWater() {
System.out.println("制作奶茶——放入冰水");
milkTea.setMilk("冰水");
}
@Override
public MilkTea build() {
System.out.println("奶茶制作完成");
return milkTea;
}
}
Producer供外部调用
public class MilkTeaProducer {
private IMilkTeaBuilder builder;
public MilkTea buildHotMilkTea(){
builder = new HotMilkTeaBuilder();
builder.buildMilk();
builder.buildTea();
builder.buildWater();
return builder.build();
}
public MilkTea buildIceMilkTea(){
builder = new IceMilkTeaBuilder();
builder.buildMilk();
builder.buildTea();
builder.buildWater();
return builder.build();
}
}
测试结果
四、总结
建造者模式隐藏复杂对象的创建细节,实现外部调用这个和创建过程的低耦合,输入参数的不同可输出多样的结果,使得系统比较灵活,便于拓展。
网友评论