意图
将一个复杂的对象拆解成若干个简单的对象,由一个组装者将简单对象一个复杂对象,简单对象基本不变,但是组合的方式可变。
何时使用
一些基本部件不变而其组合经常变化的时候
实现
我们假设一个快餐店,其中汉堡,可乐等物品基本不会变,但是组合而成的套餐却有很多种。
创建食物条目和包装的接口
public interface Item {
String name();
Float price();
Packing packing();
}
public interface Packing {
String packing();
}
创建实现packing接口的实体类
public class Bottle implements Packing {
@Override
public String packing() {
return "Bottle";
}
}
public class Wrapper implements Packing {
@Override
public String packing() {
return "Wrapper";
}
}
创建item的抽象类提供默认功能
public abstract class Drink implements Item {
@Override
public abstract Float price();
@Override
public Packing packing() {
return new Bottle();
}
}
public abstract class Food implements Item {
@Override
public abstract Float price();
@Override
public Packing packing() {
return new Wrapper();
}
}
扩展Food和Drink类
public class Chicken extends Food {
@Override
public String name() {
return "Chicken";
}
@Override
public Float price() {
return 15f ;
}
}
public class Hamburger extends Food{
@Override
public String name() {
return "Hamburger";
}
@Override
public Float price() {
return 20f;
}
}
public class Cola extends Drink {
@Override
public String name() {
return "Cola";
}
@Override
public Float price() {
return 10f;
}
}
public class Pepsi extends Drink {
@Override
public String name() {
return "Pepsi";
}
@Override
public Float price() {
return 7f;
}
}
创建一个Meal类,也就是上面所说的复杂的对象,由item组成
public class Meal {
List<Item> items = new ArrayList<>();
public void itemAdd(Item item){
items.add(item);
}
public Float getCost() {
float total = 0f;
for (Item item : items) {
total += item.price();
}
return total;
}
public void showMeal() {
for (Item item : items) {
System.out.println("name:"+item.name());
System.out.println("packing:"+item.packing().packing());
}
System.out.println("价格为;"+getCost());
}
}
创建一个建造者去组合对象
public class MealBuilder {
public Meal packages1() {
Meal meal = new Meal();
meal.itemAdd(new Cola());
meal.itemAdd(new Chicken());
return meal;
}
public Meal packages2() {
Meal meal = new Meal();
meal.itemAdd(new Pepsi());
meal.itemAdd(new Hamburger());
return meal;
}
}
演示
public class BuilderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
mealBuilder.packages1().showMeal();
mealBuilder.packages2().showMeal();
}
}
结果
name:Cola
packing:Bottle
name:Chicken
packing:Wrapper
价格为;25.0
name:Pepsi
packing:Bottle
name:Hamburger
packing:Wrapper
价格为;27.0