意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
一、介绍
建造者模式用于对于复杂对象的建立。由于复杂对象过于繁杂,采用一步一步建立的方式。
以KFC为例,KFC店食品可以自由组合,顾客可以根据需求点各种食品。这就需要我们首先的列出各种食品的信息,通过接口Item继承实现各种食物,然后使用一个容器Meal来承载这些食品,并提供各种操作方法。对于某些套餐,可以提供MealBuilder预先制定好套餐内食品。
二、建立单个食品
接口Item
集中各种食品类型,各种食品继承此接口,实现多态。
package builder;
public interface Item {
public String name();
public Packing setPacking();
public float price();
}
分类继承
不同食品属于不同类别,可在此处添加不同类别的特殊属性
package builder;
public abstract class Burger implements Item {
@Override
public builder.Packing setPacking() {
// TODO Auto-generated method stub
return new Wrapper();
}
}
具体食品
package builder;
public class VegBurger extends Burger {
@Override
public String name() {
// TODO Auto-generated method stub
return "VegBurger";
}
@Override
public float price() {
// TODO Auto-generated method stub
return 10.0f;
}
}
三、食品操作
最终顾客点餐会产生一系列食品。需要用类添加,并提供一些接口。比如添加食品、删除食品、计算总价等
package builder;
import java.util.*;
public class Meal {
private List<Item> itemList = new ArrayList<Item>();
public void addItem(Item item){
itemList.add(item);
}
public float getCost(){
float costTotal = 0.0f;
for(Item i : itemList){
costTotal += i.price();
}
return costTotal;
}
}
四、生成套餐
有些顾客直接点一个套餐。我们可以事先生成这个套餐方法。
package builder;
public class MealBuilder {
public Meal makeVegMeal(){
Meal vegMeal = new Meal();
vegMeal.addItem(new VegBurger());
vegMeal.addItem(new Water());
return vegMeal;
}
public Meal makeChiMeal(){
Meal chiMeal = new Meal();
chiMeal.addItem(new ChickenBurger());
chiMeal.addItem(new Coke());
return chiMeal;
}
}
五、调用
package builder;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
MealBuilder mealBuilder = new MealBuilder();
Meal vegMeal = mealBuilder.makeVegMeal();
float total = vegMeal.getCost();
System.out.println(total);
}
}