需求:设计一个咖啡店点餐系统。
设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。
具体类的设计如下:
在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。
如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;
所以说,工厂模式最大的优点就是:解耦。
Coffee.java
package com.itheima.pattern.factory.before;
/**
* @version v1.0
* @ClassName: Coffee
* @Description: 咖啡类
* @Author: dym
*/
public abstract class Coffee {
public abstract String getName();
//加糖
public void addsugar() {
System.out.println("加糖");
}
//加奶
public void addMilk() {
System.out.println("加奶");
}
}
AmericanCoffee.java
package com.itheima.pattern.factory.before;
/**
* @version v1.0
* @ClassName: AmericanCoffee
* @Description: 美式咖啡
* @Author: dym
*/
public class AmericanCoffee extends Coffee {
public String getName() {
return "美式咖啡";
}
}
LatteCoffee.java
package com.itheima.pattern.factory.before;
/**
* @version v1.0
* @ClassName: LatteCoffee
* @Description: 拿铁咖啡
* @Author: dym
*/
public class LatteCoffee extends Coffee {
public String getName() {
return "拿铁咖啡";
}
}
CoffeeStore.java
package com.itheima.pattern.factory.before;
/**
* @version v1.0
* @ClassName: CoffeeStore
* @Description: TODO(一句话描述该类的功能)
* @Author: dym
*/
public class CoffeeStore {
public Coffee orderCoffee(String type) {
//声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象
Coffee coffee = null;
if("american".equals(type)) {
coffee = new AmericanCoffee();
} else if("latte".equals(type)) {
coffee = new LatteCoffee();
} else {
throw new RuntimeException("对不起,您所点的咖啡没有");
}
//加配料
coffee.addMilk();
coffee.addsugar();
return coffee;
}
}
Client.java
package com.itheima.pattern.factory.before;
/**
* @version v1.0
* @ClassName: Client
* @Description: TODO(一句话描述该类的功能)
* @Author: dym
*/
public class Client {
public static void main(String[] args) {
//1,创建咖啡店类
CoffeeStore store = new CoffeeStore();
//2,点咖啡
Coffee coffee = store.orderCoffee("latte");
System.out.println(coffee.getName());
}
}
介绍三种工厂
- 简单工厂模式(不属于GOF的23种经典设计模式)
- 工厂方法模式
- 抽象工厂模式