相关资料:菜鸟教程
使用场景
使用多个简单的对象一步一步构建成一个复杂的对象。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
场景示例
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
2、
图解
案例
public class BuilderPatternDemo{
public interface 商品项{
// 获取商品名称
public String name();
// 获取打包方式
public 打包接口 packing();
// 获取价格
public float price();
}
public interface 打包接口{
public String pack();
}
public static class 纸质打包 implements 打包接口{
@Override
public String pack(){
return "Wrapper(纸盒包装)";
}
}
public static class 瓶装打包 implements 打包接口{
@Override
public String pack(){
return "Bottle(瓶装包装)";
}
}
public abstract static class 汉堡包 implements 商品项{
@Override
public final 打包接口 packing(){
return new 瓶装打包();
}
@Override
public abstract float price();
}
public abstract static class 冷饮 implements 商品项{
@Override
public final 打包接口 packing(){
return new 瓶装打包();
}
@Override
public abstract float price();
}
public static class 蔬菜汉堡包 extends 汉堡包{
@Override
public String name(){
return "Veg Bugger";
}
@Override
public float price(){
return 10.0f;
}
}
public static class 鸡腿汉堡包 extends 汉堡包{
@Override
public String name(){
return "Chicken Burger";
}
@Override
public float price(){
return 15.0f;
}
}
public static class 咖啡 extends 冷饮{
@Override
public String name(){
return "咖啡";
}
@Override
public float price(){
return 8.0f;
}
}
public static class 百事可乐 extends 冷饮{
@Override
public String name(){
return "百事可乐";
}
@Override
public float price(){
return 5.0f;
}
}
public static class 商品列表{
List<商品项> items = new ArrayList<>();
public List<商品项> addItem (商品项 item){
items.add(item);
return items;
}
public float getCost() {
float cost = 0.0f;
for(商品项 item : items){
cost += item.price();
}
return cost;
}
public void showItems() {
for(商品项 item: items){
System.out.print(" 食品:" + item.name() + " ");
System.out.print(" 打包方式:" + item.packing().pack() + "");
System.out.println(" 价格:" + item.price());
}
}
}
public interface 套餐 {
public String getName();
public 商品列表 getMeal();
}
public static class 套餐A implements 套餐 {
@Override
public String getName(){
return "套餐A";
}
@Override
public 商品列表 getMeal(){
商品列表 meal = new 商品列表();
meal.addItem(new 咖啡()).add(new 蔬菜汉堡包());
return meal;
}
}
public static class 套餐B implements 套餐 {
@Override
public String getName(){
return "套餐B";
}
@Override
public 商品列表 getMeal(){
商品列表 meal = new 商品列表();
meal.addItem(new 百事可乐()).add(new 鸡腿汉堡包());
return meal;
}
}
public static void main(String[] args) {
套餐 tc = new 套餐B();
商品列表 meal = tc.getMeal();
System.out.println("套餐:" + tc.getName());
System.out.println("商品列表:");
meal.showItems();
System.out.println("总消费:" + meal.getCost());
}
}