1.定义
封装一个产品的构造过程,并允许按步骤构造
2.使用场景及设计
2.1.使用场景
需要经过多个步骤创建的对象,如实际生活中的点餐流程,管理系统中的导出框架等
2.2.简略流程图
此处以点餐流程为例
3.测试代码
3.1.类图
3.2.测试代码
入口代码
package com.glt.designpattern.builder;
public class InitMain {
public static void main(String[] args) {
Builder builder = new Builder();
Meal breakfast = builder.breakfast();
breakfast.takeOrder();
System.out.println();
Meal lunch = builder.lunch();
lunch.takeOrder();
System.out.println();
Meal dinner = builder.dinner();
dinner.takeOrder();
System.out.println();
}
}
建造者类
package com.glt.designpattern.builder;
/**
* 建造者对象
* 生成最终对象的建造者
*/
public class Builder {
/**
* 早餐
*/
public Meal breakfast(){
Meal meal = new Meal();
meal.addItem(new BreadFood());
meal.addItem(new WaterDrink());
return meal;
}
/**
* 午餐
*/
public Meal lunch(){
Meal meal = new Meal();
meal.addItem(new PizzaFood());
meal.addItem(new BeerDrink());
return meal;
}
/**
* 晚餐
*/
public Meal dinner(){
Meal meal = new Meal();
meal.addItem(new BreadFood());
meal.addItem(new BeerDrink());
return meal;
}
}
建造者产品类
package com.glt.designpattern.builder;
/**
* 建造者对象
* 生成最终对象的建造者
*/
public class Builder {
/**
* 早餐
*/
public Meal breakfast(){
Meal meal = new Meal();
meal.addItem(new BreadFood());
meal.addItem(new WaterDrink());
return meal;
}
/**
* 午餐
*/
public Meal lunch(){
Meal meal = new Meal();
meal.addItem(new PizzaFood());
meal.addItem(new BeerDrink());
return meal;
}
/**
* 晚餐
*/
public Meal dinner(){
Meal meal = new Meal();
meal.addItem(new BreadFood());
meal.addItem(new BeerDrink());
return meal;
}
}
子项接口
package com.glt.designpattern.builder;
/**
* 每一餐需要的子项
*/
public interface Item {
public String name();
public float price();
public String packing();
}
食品对象
package com.glt.designpattern.builder;
/**
* 食品项
*/
public abstract class Food implements Item{
@Override
public String packing() {
return "盒子";
}
}
饮品对象
package com.glt.designpattern.builder;
/**
* 饮品项
*/
public abstract class Drink implements Item {
@Override
public String packing() {
return "瓶子";
}
}
具体食品类
package com.glt.designpattern.builder;
/**
* 食品类-面包
*/
public class BreadFood extends Food {
@Override
public String name() {
return "面包";
}
@Override
public float price() {
return 3;
}
}
package com.glt.designpattern.builder;
/**
* 食品类-披萨
*/
public class PizzaFood extends Food {
@Override
public String name() {
return "披萨";
}
@Override
public float price() {
return 5;
}
}
具体饮品类
package com.glt.designpattern.builder;
/**
* 饮品类-啤酒
*/
public class BeerDrink extends Drink {
@Override
public String name() {
return "啤酒";
}
@Override
public float price() {
return 3;
}
}
package com.glt.designpattern.builder;
/**
* 饮品类-水
*/
public class WaterDrink extends Drink {
@Override
public String name() {
return "水";
}
@Override
public float price() {
return 1;
}
}
输出结果:
名称:面包,水
价格:4.0
包装:盒子,瓶子
名称:披萨,啤酒
价格:8.0
包装:盒子,瓶子
名称:面包,啤酒
价格:6.0
包装:盒子,瓶子
Process finished with exit code 0
4.总结
优点:
建造者在产品的每个步骤都可以自由组合,扩展性强
缺点:
内部步骤变化复杂,会产生很多类
与工厂模式区别是此模式会有多个步骤,并且会关注每个步骤的顺序