KFC收银系统--第三部分

KFC收银系统—第三部分(抽象工厂设计模式)

  • 抽象工厂

抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类独立,客户只需要调用工厂的方法,当产品发生变化时,只需要修改对应的工厂,客户无需修改。

  • 结合抽象工厂的系统分析(抽象工厂的类图)
    KFC收银系统--第三部分_第1张图片

  • 代码:

    -首先创建抽象食物类

package product;
/**
* 
*

Title:AbstractFood

*

Description:食物的基类,定义了食物的基本属性

* @author dynamic * @date 2018年10月26日 下午2:43:39 * */ public abstract class AbstractFood { protected String foodname; protected int num; protected float price; public Float money() { return num * price; } }

创建一个接口返回食物信息

public interface FoodMessage {
	public String getMessage();
}

建立不同食物的抽象基类实现FoodMessage接口,例如饮料类,汉堡类,薯条类等,这里给出饮料的代码,其余类可照猫画虎:

/**
 * 
 *

Title:Drink

*

Description:饮料的抽象类

* @author Lenovo * @date 2018年10月26日 下午2:49:22 * */ public abstract class Drink extends AbstractFood implements FoodMessage { public String getMessage() { return (this.foodname + "-" + this.num + "-" + this.price + "-"); } }

为不同种类的食物创建具体的食物(这里以饮料类为例)
创建了两种饮料

/**
 * 
 *

Title:AppleJuice

*

Description:鲜榨西瓜汁类

* @author dynamic * @date 2018年10月26日 下午2:51:29 * */ public class AppleJuice extends Drink { public AppleJuice(int num) { this.foodname = "鲜榨西瓜汁"; this.num = num; this.price = 6.00f; } }
/**
 * 
 *

Title:GrapeJuice

*

Description:鲜榨橙汁类

* @author Lenovo * @date 2018年10月26日 下午2:52:55 * */ public class GrapeJuice extends Drink { public GrapeJuice(int num) { this.foodname = "鲜榨橙汁"; this.price = 8.00f; this.num = num; } }

所有事物创建完成后,构建负责生长食物对象的工厂,首先创建抽象KFC工厂生产抽象食物(注释掉的是自己项目中实现但是没有将源码举例出来的食物的创造)

/**
 * 
 *

Title:IFactory

*

Description:抽象工厂基类

* @author dynamic * @date 2018年10月26日 下午2:56:11 * */ public interface IFactory { public Drink createAppleJuice(int num); public Drink createGrapeJuice(int num); // public Hamburger createBeefHamburger(int num); // public Hamburger createPrawnHamburger(int num); // public FrenchFry createTomatoFrenchFry(int num); // public FrenchFry createOriginalFrencFry(int num); // public Chicken createHotChicken(int num); // public Chicken createOriginalChicken(int num); }

创建具体的KFC工厂,生成具体事物

/**
 * 
 *

Title:FoodFactory

*

Description:具体KFC工厂,生产具体事物

* @author dynamic * @date 2018年10月26日 下午2:58:46 * */ public class FoodFactory implements IFactory { @Override public Drink createAppleJuice(int num) { return new AppleJuice(num); } @Override public Drink createGrapeJuice(int num) { // TODO Auto-generated method stub return new GrapeJuice(num); } @Override public Hamburger createBeefHamburger(int num) { // TODO Auto-generated method stub return new BeefHamburger(num); } @Override public Hamburger createPrawnHamburger(int num) { // TODO Auto-generated method stub return new PrawnHamburger(num); } @Override public FrenchFry createTomatoFrenchFry(int num) { // TODO Auto-generated method stub return new TomatoFrenchFry(num); } @Override public FrenchFry createOriginalFrencFry(int num) { // TODO Auto-generated method stub return new OriginalFrenchFry(num); } @Override public Chicken createOriginalChicken(int num) { // TODO Auto-generated method stub return new OriginalChicken(num); } @Override public Chicken createHotChicken(int num) { // TODO Auto-generated method stub return new HotChicken(num); } }

最后创建售货员使用工厂

/**
 * 
 *

Title:Salesclerk

*

Description:如何使用工厂获得食物对象以及对事物的操作

* @author dynamic * @date 2018年10月26日 下午3:00:23 * */ public class Salesclerk { private IFactory factory; private StringBuilder message = new StringBuilder(); public Salesclerk(IFactory factory) { this.factory = factory; } public StringBuilder getMessage() { return this.message; } public Float orderAppleJuice(int num) { Drink j = factory.createAppleJuice(num);// 获得苹果汁对象 message.append(j.getMessage());// 输出苹果汁信息 return j.money(); // 返回苹果汁的总价钱 } public Float orderGrapeJuice(int num) { Drink jDrink = factory.createGrapeJuice(num); message.append(jDrink.getMessage()); return jDrink.money(); } public Float orderBeefHamburger(int num) { Hamburger beef = factory.createBeefHamburger(num); message.append(beef.getMessage()); return beef.money(); } public Float orderPrawnHamburger(int num) { Hamburger prawn = factory.createPrawnHamburger(num); message.append(prawn.getMessage()); return prawn.money(); } public Float orderHotChicken(int num) { Chicken hot = factory.createHotChicken(num); message.append(hot.getMessage()); return hot.money(); } public Float orderOriginalChicken(int num) { Chicken original = factory.createOriginalChicken(num); message.append(original.getMessage()); return original.money(); } public Float orderTomatoFrenchFry(int num) { FrenchFry tomato = factory.createTomatoFrenchFry(num); message.append(tomato.getMessage()); return tomato.money(); } public Float orderOriginalFrenchFry(int num) { FrenchFry original = factory.createOriginalFrencFry(num); message.append(original.getMessage()); return original.money(); } }

最后我们创建一个用户,模拟点餐的效果,测试一下代码是否能正常运行

/**
  * 
  *

Title:Custom

*

Description:模拟点餐效果(用来测试抽象工厂是否能够正常运行)

* @author dynamic * @date 2018年10月26日 下午3:02:22 * */ public class Custom { public static void main(String[] args) { IFactory factory = new FoodFactory(); Salesclerk salesclerk = new Salesclerk(factory); System.out.println("一个牛肉汉堡"); salesclerk.orderAppleJuice(1); salesclerk.orderGrapeJuice(1); salesclerk.orderBeefHamburger(1); System.out.println(salesclerk.getMessage()); } }

测试结果:
KFC收银系统--第三部分_第2张图片

至此抽象工厂模式下的kFC收银系统的点餐部分的核心变完成了。
可视化界面的实现源码请点击查看

你可能感兴趣的:(程序设计方法学,抽象工厂,设计模式,java,KFC收银系统)