一、浅谈建造者模式
建造者模式会将多个简单的对象一步步构建成一个复杂的对象。显然,这种设计模式也属于创建型模式。这种模式同样也提供了创建对象的最佳方式。xxxBuilder 类会一步步去构造最终我们所需的对象,但是 xxxBuilder 类独立于其它的对象。
建造者模式有点像高中我们数学所学的排列组合,它将不同种类的产品相互组合,得到很多种排列方式。就好比我们日常生活中,在餐馆点餐,餐馆会向我们推荐单人餐、四人餐、六人餐等等之类的套餐,不同种类的菜品排列组合成了套餐。在建造者模式中,我们也可以将其形象的理解为"套餐"。
"套餐" 在建造者模式如何体现呢?下面我们看代码来一起理解~
二、测试代码
1)代码架构图
2)代码包图
3)代码
Interface
<1> PackageFood
public interface PackageFood {
String packageFood();
}
<2> Food
public interface Food {
String foodName();
double foodPrice();
PackageFood packageInstance();
}
ImplPackage
<1> Cup
public class Cup implements PackageFood {
@Override
public String packageFood() {
return "Use a cup to package.";
}
}
<2> Plate
public class Plate implements PackageFood {
@Override
public String packageFood() {
return "Use a plate to package.";
}
}
AbstractClass
<1> Dishes
public abstract class Dishes implements Food {
@Override
public PackageFood packageInstance() {
return new Plate();
}
}
<2> Drinks
public abstract class Drinks implements Food {
@Override
public PackageFood packageInstance() {
return new Cup();
}
}
Bean
1)DishesBean
<1> Mapo Tofu
public class MapoTofu extends Dishes {
@Override
public String foodName() {
return "Mapo Tofu";
}
@Override
public double foodPrice() {
return 16.32D;
}
}
<2> Rice
public class Rice extends Dishes {
@Override
public String foodName() {
return "Rice";
}
@Override
public double foodPrice() {
return 1.00D;
}
}
<3> ZongZi
public class ZongZi extends Dishes {
@Override
public String foodName() {
return "ZongZi";
}
@Override
public double foodPrice() {
return 8.78D;
}
}
2)DrinksBean
<1> FruitTea
public class FruitTea extends Drinks {
@Override
public String foodName() {
return "Fruit Tea";
}
@Override
public double foodPrice() {
return 18.20D;
}
}
<2> HuiYuanJuice
public class HuiYuanJuice extends Drinks {
@Override
public String foodName() {
return "HuiYuan Juice";
}
@Override
public double foodPrice() {
return 10.00D;
}
}
Meal
public class Meal {
private final ArrayList<Food> foods = new ArrayList<>();
public void addFood(Food food) {
foods.add(food);
}
public void totalPrice() {
double cost = 0.0D;
for (Food food : foods) {
cost += food.foodPrice();
}
System.out.println("总费用为: " + cost);
}
public void whatFood() {
for (Food food : foods) {
System.out.println(food.foodName() + " "
+ food.foodPrice() + " "
+ food.packageInstance().packageFood());
}
}
}
MealBuilder
public class MealBuilder {
/**
* 套餐一
* prepareFirstSetOfDish
* @return Meal
*/
public Meal prepareFirstSetOfDish() {
Meal meal = new Meal();
meal.addFood(new MapoTofu());
meal.addFood(new Rice());
meal.addFood(new HuiYuanJuice());
return meal;
}
/**
* 套餐二
* prepareFirstSetOfDish
* @return Meal
*/
public Meal prepareSecondSetOfDish() {
Meal meal = new Meal();
meal.addFood(new MapoTofu());
meal.addFood(new ZongZi());
meal.addFood(new FruitTea());
return meal;
}
/**
* 四人餐
* prepareFourPersonDish
* @return Meal
*/
public Meal prepareFourPersonDish () {
Meal meal = new Meal();
meal.addFood(new MapoTofu());
meal.addFood(new ZongZi());
meal.addFood(new Rice());
meal.addFood(new FruitTea());
meal.addFood(new HuiYuanJuice());
return meal;
}
}
Test 测试类
public class Test {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
// 套餐一
System.out.println("套餐一");
Meal mealFirst = mealBuilder.prepareFirstSetOfDish();
mealFirst.whatFood();
mealFirst.totalPrice();
System.out.println();
// 套餐二
System.out.println("套餐二");
Meal mealSecond = mealBuilder.prepareSecondSetOfDish();
mealSecond.whatFood();
mealSecond.totalPrice();
System.out.println();
// 四人餐
System.out.println("四人餐");
Meal fourPersonMeal = mealBuilder.prepareFourPersonDish();
fourPersonMeal.whatFood();
fourPersonMeal.totalPrice();
}
}
测试结果
套餐一
Mapo Tofu 16.32 Use a plate to package.
Rice 1.0 Use a plate to package.
HuiYuan Juice 10.0 Use a cup to package.
总费用为: 27.32
套餐二
Mapo Tofu 16.32 Use a plate to package.
ZongZi 8.78 Use a plate to package.
Fruit Tea 18.2 Use a cup to package.
总费用为: 43.3
四人餐
Mapo Tofu 16.32 Use a plate to package.
ZongZi 8.78 Use a plate to package.
Rice 1.0 Use a plate to package.
Fruit Tea 18.2 Use a cup to package.
HuiYuan Juice 10.0 Use a cup to package.
总费用为: 54.3
总结:
建造者模式是将不同的简单类经过一系列操作,最终构建为一个复杂对象的过程。建造者模式更关注的时零件装配的过程。建造者模式通常使用在一些基础组件不改变,但是组合经常会发生变化的时候。