KFC收银系统--第三部分

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收银系统的点餐部分的核心变完成了。
可视化界面的实现源码请点击查看

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值