一、算法设计思路
1、所用类:
2、食品类类图:
3、工厂类类图:
二、主要函数实现
1、单品的接口
/**
* 所有单品的接口
* 随后添加的单品类只需要implements此接口并实现其方法
* 定义打印输出不同单品的相关信息
*/
public interface Food {
/**
* 打印输出食物信息
*/
void printMessage();
}
2、单品基本信息抽象类
/**
* 单品抽象基类
* 定义单品的共同属性
*/
public class AbstractFood {
//类别
protected String kind;
//数量
protected int num;
//价格
protected float price;
//合计
public float totalPrice(){
return this.num * this.price;
}
}
3、单品抽象工厂
/**
* 肯德基抽象工厂:生产抽象食物
* 抽象工厂中创建各种食物,都是抽象食物。
*/
public interface Factory {
public interface factory {
//生产汉堡
public Hamburger createHamburger(int num);
//生产炸鸡类食物
public Chicken createChicken(int num);
//生产甜点
public Dessert createDessert(int num);
//生产饮品
public Drinks createDrinks(int num);
}
}
4、实例工厂,生产具体食物
//KFC实际工厂,生产具体食物
public class KFCFactory implements Factory{
//生产香辣鸡腿堡
public ZingerBurger createZingerBurger(int num) {
return new ZingerBurger(num);
}
//生产嫩牛五方
public BeefBurger createBeefBurger(int num) {
return new BeefBurger(num);
}
//奥尔良烤鸡腿堡
public OrleansBurger createOrleansBurger(int num) {
return new OrleansBurger(num);
}
//生产老北京鸡肉卷 //奥尔良烤翅
//香辣鸡翅 //鸡米花
//生产薯条 //生产蛋挞
//生产圣代 //生产柠檬红茶
//生产可乐 //生产雪顶咖啡
//生产单人套餐
public OneCombo createOneCombo(int num){
return new OneCombo(num);
}
//生产双人套餐 //生产三人套餐
}
5、点餐时,就向KFC(工厂)请求
/**
* Customer类可通过构造方法将KFC实际工厂传入
* 点餐时,就向KFC(工厂)请求,Customer不生产食物(不使用new生成对象)
*/
public class Customer {
//抽象工厂
private Factory factory;
//构造方法将抽象工厂作为参数传入
public Customer(Factory factory){
this.factory = factory;
}
/**
* 点餐
*/
public float orderZingerBurger(int num){
//获得香辣鸡腿堡
Hamburger zingerBurger = factory.createZingerBurger(num);
//输出订购信息
zingerBurger.printMessage();
//返回总价
return zingerBurger.totalPrice();
}
public float orderBeefBurger(int num){
//获得嫩牛五方
Hamburger beefBurger = factory.createBeefBurger(num);
//输出订购信息
beefBurger.printMessage();
//返回总价
return beefBurger.totalPrice();
}
//获得奥尔良烤鸡腿堡 //获得老北京鸡肉卷
//获得奥尔良烤翅 //获得香辣鸡翅
//获得鸡米花 //获得薯条
//获得蛋挞 //获得圣代
//获得奶茶 //获得可乐
//获得雪顶咖啡
public float orderOneCombo(int num) {
//单人套餐
Combo oneCombo = factory.createOneCombo(num);
//输出订购信息
oneCombo.printMessage();
//返回总价
return oneCombo.totalPrice();
}
//双人套餐 //三人套餐
}
6、点餐类
import java.util.Scanner;
public class KFCtest {
private static Scanner input;
public static void main(String[] args) {
/**
* 定义一个肯德基(factory类型)
*/
Factory factory = new KFCFactory();
/**
* 创建客户
*/
Customer customer = new Customer(factory);
input = new Scanner(System.in);
float ZingerBurger = 0;float OrleansBurger= 0;
float BeefBurger= 0;float BeijingChicken = 0;
float ChickenWings= 0;float SpicyWings = 0;
float PopcornChicken = 0; float Chips= 0;
float EggTart= 0;float Sundae = 0;
float Cola= 0; float BlackTea= 0;
float Coffee = 0;float OneCombo= 0;
float TwoCombo= 0;float ThreeCombo = 0;
//输出菜单
while(true){
System.out.println("请选择序号点餐:>");
int a=input.nextInt();
System.out.println("请选择数量:>");
int b=input.nextInt();
switch(a){
case 1:
//香辣鸡腿堡
ZingerBurger = customer.orderZingerBurger(b);
break;
........
case 14:
//单人套餐
OneCombo = customer.orderOneCombo(b);
break;
case 15:
//双人套餐
TwoCombo = customer.orderTwoCombo(b);
break;
case 16:
//三人套餐
ThreeCombo = customer.orderThreeCombo(b);
break;
default:
System.out.println("对不起,您所选择的餐品错误");
break;
}
System.out.println("请选择是否继续点餐(1.是 2.否):>");
int c=input.nextInt();
if(c!=1){
break;
}
}
float money1=ZingerBurger+OrleansBurger+BeefBurger+BeijingChicken;
float money2=+ChickenWings+SpicyWings+PopcornChicken;
float money3=+Chips+EggTart+Sundae;
float money4=Cola+BlackTea+Coffee;
float money5=OneCombo+TwoCombo+ThreeCombo;
float money=money1+money2+money3+money4+money5;
System.out.println("此次点餐共计:"+money);
System.out.println("请问您是否具有优惠券? (1.是 2.否):>");
int c=input.nextInt();
int d=0;
if(c==1){
System.out.println("请输入优惠券金额:>");
d=input.nextInt();
}
System.out.println("请输入实付金额:>");
int e=input.nextInt();
float changes=e-(money-d);
System.out.println("找零:"+changes);
System.out.println("欢迎下次点餐,祝您用餐愉快!");
}
}
三、结果截图
1、菜单界面:
2、单点商品,无优惠券的结果显示:
3、点套餐,并且使用优惠券的结果:
四、调试截图
1、点餐调试:
2、结账并且使用优惠券:
五、总结
本次作业中,我们使用了工厂方法模式和抽象工厂模式两种设计模式,并应用了“开闭”原则和“依赖倒置”原则。
肯德基实例工厂——生产食物的工厂;食物(汉堡、鸡翅、薯条、可乐等等)——工厂生产的产品;顾客——点餐;用户——使用点餐系统为顾客点餐及结账。
肯德基店就是一个具体的工厂,此时,我们需要抽象一个工厂,在抽象工厂中指明了生产各种抽象食物的方法,如生产汉堡、鸡翅等。肯德基店就需要实现这个抽象工厂,生产具体的食品,如生产麻辣鸡腿汉堡、生产奥尔良鸡翅等。
前面提到了“抽象食物”,我们还需要对每个具体的食物添加抽象父类,如汉堡就是抽象父类,香辣鸡腿汉堡就是汉堡的一个子类,依次类推。这时,我们会发现,每一种食物又都存在着一些共同的属性,如风味、单价、数量等,因此,我们继续进行抽象,所有的抽象食物都继承一个抽象父类。如何订购肯德基生产的食物呢?这与工厂方法模式有所不同,这里我们使用组合的方式,将抽象工厂作为顾客类中的一个实例变量,顾客需要任何产品的时候,只需要向工厂请求即可,这就是抽象工厂模式的应用方式。顾客类和工厂类分开,客户无须修改就可以获得新产品。