情景模拟:一位客户在咖啡店买咖啡,已知咖啡店的咖啡由一家工厂供货,现要求让客户在咖啡店下单后能马上得到一杯咖啡。
1.创建一个抽象类coffee,在其中定义制作咖啡的抽象方法makeCoffee,返回类型为String类型
还分别定义了加糖、加奶、加冰、加热这四种方法,供客户选择
public abstract class Coffee {
public abstract String makeCoffee();
public void addSugar() {
System.out.println("加糖");
}
public void addMilk() {
System.out.println("加奶");
}
public void addIce(){
System.out.println("加冰");
}
public void addWarm(){
System.out.println("加热");
}
}
2.创建拿铁咖啡类
重写制作方法makeCoffee
//子类latteCoffee继承父类Coffee
public class latteCoffee extends Coffee{
@Override
public String makeCoffee() {
return "一杯拿铁制作完成";
}
}
3.创建冰美式类
继续重写制作方法makeCoffee
//子类icedAmerican继承父类Coffee
public class icedAmerican extends Coffee{
@Override
public String makeCoffee() {
return "一杯冰美式制作完成";
}
}
4.创建咖啡工厂类CoffeeFactory
public class CoffeeFactory {
public CoffeeFactory(){
}
//定义返回值为Coffee类型的生成咖啡的方法produceCoffee,其中参数是咖啡名,参数类型是String
public coffee produceCoffee(String coffeeName){
//假设在收到咖啡店的订单之前,咖啡工厂还没有生产咖啡
Coffee coffee = null;
//这里只考虑客户的订单是拿铁或者冰美式的情况
//如果收到的订单是拿铁,那就生产一杯新的拿铁咖啡
if("latteCoffee".equals(coffeeName)){
coffee = new latteCoffee();
//同理,如果收到的订单是冰美式,就生产一杯新的冰美式
}else if("icedAmerican".equals(coffeeName)){
coffee = new icedAmerican();
}
//注意:完成咖啡店的订单后,要将咖啡返回给咖啡店
return coffee;
}
}
5.创建咖啡店类CoffeeStore
public class CoffeeStore {
//这里有两个参数,一个是类型为String的coffeeName,一个是类型为CoffeeFactory的coffeeFactory
public coffee orderCoffee(String coffeeName, CoffeeFactory coffeeFactory){
//通过调用coffeeFactory对象的produceCoffee方法并传入一个具体的订单上的咖啡名,来动态地创建并初始化一个与该名称对应的Coffee类对象coffee,并将值赋值给变量coffee
//通过咖啡工厂生产客户订下的咖啡
Coffee coffee = CoffeeFactory.produceCoffee(coffeeName);
//将做好的咖啡返回给客户
return coffee;
}
}
6.创建一个客户类
public class Client {
public static void main(String[] args) {
//客户无需知道咖啡的制作过程,只需在咖啡店里下单即可
//创建一家新的咖啡店
CoffeeStore coffeeStore = new CoffeeStore();
//客户下单一杯拿铁
//咖啡由一家新的工厂制作
//咖啡店从工厂拿货给客户
Coffee coffee = coffeeStore.orderCoffee("latteCoffee", new CoffeeFactory());
//要求:加奶、加糖、加冰
coffee.addMilk();
coffee.addSugar();
coffee.addIce();
System.out.println(coffee.makeCoffee());
}
}
7.运行一下