Java设计模式——建造者模式
构建器模式通过使用简单对象,逐步地构建复杂对象, 它是一种创建模式。
举例说明:
-
假设我们去快餐店吃饭,那里有汉堡和冷饮。
-
汉堡有可能是素食汉堡(Veg Burger)或鸡肉堡(Chicken Burger),它们都是用包装纸包装的。
-
冷饮有可能是可乐(coke)或者百事可乐(pepsi),它们都是用瓶子装的。
-
我们将创建一个表示食品(如汉堡和冷饮)信息的 Item 接口(名称、打包方式、价格),以及实现 Item 接口的具体类。
-
同时再创建一个表示打包方式(如汉堡用包装纸包装,可乐用瓶子装)的Packing接口以及Packing的具体类。
-
然后,创建一个Meal类,它包含食物的信息(Item)。
-
最后,创建一个MealBuilder类,用来生产各种Meal。

1、创建Item 接口和Packing接口
// Item
public interface Item {
public String name();
public Packing packing();
public float price();
}
// Packing
public interface Packing {
public String pack();
}
2、创建Packing接口的实现类
// Wrapper
public class Wrapper implements Packing {
@Override
public String pack() {
return "Wrapper";
}
}
// Bottle
public class Bottle implements Packing {
@Override
public String pack() {
return "Bottle";
}
}
3、创建Item接口的抽象类,实现了默认的打包方式功能
// Burger
public abstract class Burger implements Item {
@Override
public Packing packing() {
return new Wrapper();
}
@Override
public abstract float price();
}
// ColdDrink
public abstract class ColdDrink implements Item {
@Override
public Packing packing() {
return new Bottle();
}
@Override
public abstract float price();
}
4、创建汉堡和冷饮的实现类
// VegBurger
public class VegBurger extends Burger {
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "Veg Burger";
}
}
// ChickenBurger
public class ChickenBurger extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "Chicken Burger";
}
}
// Coke
public class Coke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "Coke";
}
}
// Pepsi
public class Pepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "Pepsi";
}
}
5、创建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());
}
}
}
6、创建 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;
}
}
7、测试,BuiderPatternDemo 使用 MealBuider 来演示构建器模式
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());
}
}
8、测试结果
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5


