软件设计模式与体系结构 实验三 生成器模式
【实验内容和要求】
实例:KFC套餐
建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。利用建造者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
一、实验目的:
1) 掌握建造者模式(Builder)的特点
2) 分析具体问题,使用建造者模式进行设计。
二、实验环境:
Eclipse
三、实验内容:
【模式UML图】
【模式代码(JAVA语言实现)】
public class Builder {
public static void main(String[] args) {
//套餐A
MealBuilder mealBuilderA = new MealBuilderA(); //准备套餐A的服务员
KFCWaiter waiter = new KFCWaiter(mealBuilderA);
//获得套餐
Meal mealA = waiter.construct();
System.out.print("套餐A的组成部分:");
System.out.println("食物:"+mealA.getFood()+"; "+"饮品:"+mealA.getDrink());
//套餐B
MealBuilder mealBuilderB = new MealBuilderB(); //准备套餐B的服务员
waiter = new KFCWaiter(mealBuilderB);
//获得套餐
Meal mealB = waiter.construct();
System.out.print("套餐B的组成部分:");
System.out.println("食物:"+mealB.getFood()+"; "+"饮品:"+mealB.getDrink());
}
}
/**
* 具体的产品对象
*/
class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
/**
* 抽象建造者对象
*/
abstract class MealBuilder {
Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal(){
return meal;
}
}
/**
* 套餐A的建造者
*/
class MealBuilderA extends MealBuilder {
public void buildDrink() {
meal.setDrink("可乐");
}
public void buildFood() {
meal.setFood("汉堡");
}
}
/**
* 套餐B的建造者
*/
class MealBuilderB extends MealBuilder {
public void buildDrink() {
meal.setDrink("果汁");
}
public void buildFood() {
meal.setFood("鸡肉卷");
}
}
/**
* Director(指导者)
*/
class KFCWaiter {
private MealBuilder mealBuilder;
public KFCWaiter(MealBuilder mealBuilder) {
this.mealBuilder = mealBuilder;
}
public Meal construct(){
//准备食物
mealBuilder.buildFood();
//准备饮料
mealBuilder.buildDrink();
//准备完毕,返回一个完整的套餐给客户
return mealBuilder.getMeal();
}
}
【运行截图】
四、心得体会:
通过本次实验,学会了使用建造者模式。建造者模式的适用性如下:
- 关注按照步骤创建一个复杂的对象
- 将所建造的产品最后一次性返回,而不是一点一点地返回