这一篇我们一起学习下建造者模式,建造者模式呢就是使用很多的比较简单的对象一步一步的组合成复杂的对象。一般这种模式应用于需要生成的对象具有复杂的内部结构或者需要生成的对象内部属性本身相互依赖。比如去肯德基买吃的,汉堡,薯条,可乐,鸡腿,这些单个的对象是不变的,但是组合在一起就会出现很多的组合,还有就是java的StringBuilder也是利用建造者模式的,有兴趣的可以去查看相关资料。
接下来我们看个小列子,就是去肯德基
步骤一:创建一个食物清单和包装的接口
1.Item.java
public interface Item { public String name(); public Packing packing(); public float price(); }
2.包装接口
public interface Packing { public String pack(); }步骤二:创建包装接口的实现类
1.纸盒包装 Wrapper.java
public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } }2.杯子包装 Bottle.java
public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
在这里说明一下,后面那个类实现了Item这个接口,都是可以调用包装类的实现类
步骤三:创建实现Item接口的抽象类,并且该类提供了默认的方法
1.Burger.java 汉堡类
public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); }
2.ColdDrink 冷饮类
public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); }· 这两个抽象类实现了Item接口,也就是说这两个抽象类在后面被继承的自雷中既可以调用该类的默认方法,也可以重写默认的方法,也可以调用实现了Packing的实现类
步骤四:创建继承了Burger和ColdDrink的子类
1.VegBurger 素菜汉堡类
public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } }2.ChickenBurger 鸡肉汉堡类
public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } }3.Coke 可口可乐类
public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } }4.Pepsi 百事可乐类
public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }步骤五:创建一个Meal类,带有上面定义的Item对象
import java.util.ArrayList; import java.util.List; public class Meal { private List<Item> items = new ArrayList<Item>(); public void addItem(Item item){ items.add(item); } public float getCost(){ float cost = 0.0f; for (Item item : items) { cost += item.price(); } return cost; } public void showItems(){ for (Item item : items) { System.out.print("Item : "+item.name()); System.out.print(", Packing : "+item.packing().pack()); System.out.println(", Price : "+item.price()); } } }
步骤六:创建一个MealBuilder类,负责创建Meal类
public class MealBuilder { public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }步骤七: BuiderPatternDemo 使用 MealBuider 来演示建造者模式(Builder Pattern)。
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " +vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " +nonVegMeal.getCost()); } }