一、算法设计思路
1、所用类:
2、食品类类图:
3、工厂类类图:
二、主要函数实现
抽象食物类
public class AbstractFood {
//类别
protected String kind;
//数量
protected int num;
//价格
protected float price;
//合计
public float totalPrice(){
return this.num * this.price;
}
}
食物接口类
public interface Food {
/**
* 打印输出食物信息
*/
void printMessage();
}
抽象工厂类factory
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);
}
public Hamburger createZingerBurger(int num);
public Hamburger createBeefBurger(int num);
public Hamburger createOrleansBurger(int num);
public Hamburger createBeijingChicken(int num);
public Chicken createChickenWings(int num);
public Chicken createSpicyWings(int num);
public Chicken createPopcornChicken(int num);
public Dessert createChips(int num);
public Dessert createEggTart(int num);
public Dessert createSundae(int num);
public Drinks createBlackTea(int num);
public Drinks createCola(int num);
public Drinks createCoffee(int num);
public Combo createOneCombo(int num);
public Combo createTwoCombo(int num);
public Combo createThreeCombo(int num);
实际工厂类KFCfactory
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 BeijingChicken createBeijingChicken(int num) {
return new BeijingChicken(num);
}
//奥尔良烤翅
public ChickenWings createChickenWings(int num) {
return new ChickenWings(num);
}
//香辣鸡翅
public SpicyWings createSpicyWings(int num) {
return new SpicyWings(num);
}
//鸡米花
public PopcornChicken createPopcornChicken(int num) {
return new PopcornChicken(num);
}
//生产薯条
public Chips createChips(int num){
return new Chips(num);
}
//生产蛋挞
public EggTart createEggTart(int num){
return new EggTart(num);
}
//生产圣代
public Sundae createSundae(int num){
return new Sundae(num);
}
//生产柠檬红茶
public BlackTea createBlackTea(int num){
return new BlackTea(num);
}
//生产可乐
public Cola createCola(int num){
return new Cola(num);
}
//生产雪顶咖啡
public Coffee createCoffee(int num){
return new Coffee(num);
}
//生产单人套餐
public OneCombo createOneCombo(int num){
return new OneCombo(num);
}
//生产双人套餐
public TwoCombo createTwoCombo(int num){
return new TwoCombo(num);
}
//生产三人套餐
public ThreeCombo createThreeCombo(int num){
return new ThreeCombo(num);
}
}
测试类:
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;
System.out.println(" 欢迎进入KFC点餐系统! \n"
+" --------------------------------------------------------------------- \n"
+" ****************************** KFC菜单 ******************************* \n"
+" | | | | | | 汉堡类: | | | | | \n"
+" 1.香辣鸡腿堡 ---------19.0元 2.奥尔良烤鸡腿堡 -19.5元 \n"
+" 3.嫩牛五方 -----------18.0元 4.老北京鸡肉卷 ---17.0元 \n"
+" --------------------------------------------------------------------- \n"
+" | | | | | | 鸡肉类: | | | | | \n"
+" 5.奥尔良烤翅(一对)--12.5元 6.香辣鸡翅 -------11.5元 \n"
+" 7.鸡米花 -------------11.0元 \n"
+" --------------------------------------------------------------------- \n"
+" | | | | | | 甜点类: | | | | | \n"
+" 8.薯条 ---------------14.0元 9.蛋挞 -----------8.0元 \n"
+" 10.圣代 --------------11.0元 \n"
+" --------------------------------------------------------------------- \n"
+" | | | | | | 饮品类: | | | | | \n"
+" 11.可乐 ---------------9.5元 12.柠檬红茶 -------11.5元 \n"
+" 13.雪顶咖啡 -----------14.5元 \n"
+" --------------------------------------------------------------------- \n"
+" --------------------------------------------------------------------- \n"
+" | | | | | | 套餐类: | | | | | \n"
+" 14.单人套餐 -----------55元 \n"
+" 1个香辣鸡腿堡+1对香辣鸡翅+1包薯条+1杯可乐/柠檬红茶(任点) \n"
+" 15.双人套餐 -----------75元 \n"
+" 1个香辣鸡腿堡+1个奥尔良烤鸡腿堡/嫩牛五方/老北京鸡肉卷(任点) \n"
+" 1对奥尔良烤翅+2个蛋挞+2杯可乐/奶茶(任点) \n"
+" 16.三人套餐 -----------91元 \n"
+" 3个奥尔良烤鸡腿堡/嫩牛五方/老北京鸡肉卷(任点) \n"
+" 1对奥尔良烤翅+1对香辣鸡翅+1包鸡米花 \n"
+" 1包薯条+2杯圣代+2杯可乐/奶茶(任点)+1杯咖啡 \n"
+" *********************************************************************** \n");
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 2:
//奥尔良烤鸡腿堡
OrleansBurger = customer.orderOrleansBurger(b);
break;
case 3:
//嫩牛五方
BeefBurger = customer.orderBeefBurger(b);
break;
case 4:
//老北京鸡肉卷
BeijingChicken = customer.orderBeijingChicken(b);
break;
case 5:
//奥尔良烤鸡翅
ChickenWings = customer.orderChickenWings(b);
break;
case 6:
//香辣鸡翅
SpicyWings = customer.orderSpicyWings(b);
break;
case 7:
//鸡米花
PopcornChicken = customer.orderPopcornChicken(b);
break;
case 8:
//薯条
Chips = customer.orderChips(b);
break;
case 9:
//蛋挞
EggTart = customer.orderEggTart(b);
break;
case 10:
//圣代
Sundae = customer.orderSundae(b);
break;
case 11:
//可乐
Cola = customer.orderCola(b);
break;
case 12:
//柠檬红茶
BlackTea = customer.orderBlackTea(b);
break;
case 13:
//雪顶咖啡
Coffee = customer.orderCoffee(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("欢迎下次点餐,祝您用餐愉快!");
}
}
五、总结
本次作业中,我们使用了工厂方法模式和抽象工厂模式两种设计模式,并应用了“开闭”原则和“依赖倒置”原则。
肯德基实例工厂——生产食物的工厂;食物(汉堡、鸡翅、薯条、可乐等等)——工厂生产的产品;顾客——点餐;用户——使用点餐系统为顾客点餐及结账。
肯德基店就是一个具体的工厂,此时,我们需要抽象一个工厂,在抽象工厂中指明了生产各种抽象食物的方法,如生产汉堡、鸡翅等。肯德基店就需要实现这个抽象工厂,生产具体的食品,如生产麻辣鸡腿汉堡、生产奥尔良鸡翅等。
前面提到了“抽象食物”,我们还需要对每个具体的食物添加抽象父类,如汉堡就是抽象父类,香辣鸡腿汉堡就是汉堡的一个子类,依次类推。这时,我们会发现,每一种食物又都存在着一些共同的属性,如风味、单价、数量等,因此,我们继续进行抽象,所有的抽象食物都继承一个抽象父类。如何订购肯德基生产的食物呢?这与工厂方法模式有所不同,这里我们使用组合的方式,将抽象工厂作为顾客类中的一个实例变量,顾客需要任何产品的时候,只需要向工厂请求即可,这就是抽象工厂模式的应用方式。顾客类和工厂类分开,客户无须修改就可以获得新产品。