KFC收银系统—第三部分(抽象工厂设计模式)
- 抽象工厂
抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类独立,客户只需要调用工厂的方法,当产品发生变化时,只需要修改对应的工厂,客户无需修改。
-
结合抽象工厂的系统分析(抽象工厂的类图)
-
代码:
-首先创建抽象食物类
package product;
/**
*
*<p>Title:AbstractFood</p>
*<p>Description:食物的基类,定义了食物的基本属性</p>
* @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接口,例如饮料类,汉堡类,薯条类等,这里给出饮料的代码,其余类可照猫画虎:
/**
*
*<p>Title:Drink</p>
*<p>Description:饮料的抽象类</p>
* @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 + "-");
}
}
为不同种类的食物创建具体的食物(这里以饮料类为例)
创建了两种饮料
/**
*
*<p>Title:AppleJuice</p>
*<p>Description:鲜榨西瓜汁类</p>
* @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;
}
}
/**
*
*<p>Title:GrapeJuice</p>
*<p>Description:鲜榨橙汁类</p>
* @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工厂生产抽象食物(注释掉的是自己项目中实现但是没有将源码举例出来的食物的创造)
/**
*
*<p>Title:IFactory</p>
*<p>Description:抽象工厂基类</p>
* @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工厂,生成具体事物
/**
*
*<p>Title:FoodFactory</p>
*<p>Description:具体KFC工厂,生产具体事物</p>
* @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);
}
}
最后创建售货员使用工厂
/**
*
*<p>Title:Salesclerk</p>
*<p>Description:如何使用工厂获得食物对象以及对事物的操作</p>
* @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();
}
}
最后我们创建一个用户,模拟点餐的效果,测试一下代码是否能正常运行
/**
*
*<p>Title:Custom</p>
*<p>Description:模拟点餐效果(用来测试抽象工厂是否能够正常运行)</p>
* @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收银系统的点餐部分的核心变完成了。
可视化界面的实现源码请点击查看