概念:定义一个用于创建对象的接口,让子类来决定实例化哪个产品类对象,工厂方法使得了实例化延迟到了其工厂的子类
工厂方法主要角色:
抽象工厂(Abstract Factory):提供创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
具体工厂(Concrete Factory):主要实现了抽象工厂的抽象方法,完成具体产品的创建
抽象产品(Product):定义了产品的规范,描述产品的主要特性和功能
具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂一 一对应
抽象工厂角色
CoffeeFactory.java 咖啡
// 抽象工厂: 咖啡工厂
public interface CoffeeFactory {
// 创建咖啡的方法
Coffee createCoffee();
}
具体工厂角色
AmericanCoffeeFactory.java 生产美式咖啡的工厂
// 具体工厂:美式咖啡工厂 专门生产美式咖啡
public class AmericanCoffeeFactory implements CoffeeFactory {
//实现创建咖啡方法,返回美式咖啡具体产品
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
}
LatteCoffeeFactory.java 生产拿铁咖啡的工厂
// 具体工厂:拿铁咖啡工厂 专门生产拿铁咖啡
public class LatteCoffeeFactory implements CoffeeFactory {
// 实现创建咖啡方法,返回拿铁咖啡
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
}
抽象产品角色
Coffee.java
// 抽象产品: 咖啡
public abstract class Coffee {
public abstract String getName();
//加糖
public void addSugar(){
System.out.println("加糖");
}
// 加奶
public void addMilk(){
System.out.println("加奶");
}
}
具体产品角色
AmericanCoffee.java 美式咖啡具体产品
// 美式咖啡
public class AmericanCoffee extends Coffee{
@Override
public String getName() {
return "美式咖啡";
}
}
LatteCoffee.java 拿铁咖啡具体产品
// 拿铁咖啡
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拿铁咖啡";
}
}
咖啡店类
用户来咖啡店购买产品,咖啡店实例化具体工厂,再由具体工厂来生产对应的咖啡种类
CoffeeStore.java
// 咖啡店类
public class CoffeeStore {
//声明一个私有的工厂属性
private CoffeeFactory factory;
//设置咖啡店的生产工厂
public void setFactory(CoffeeFactory coffeeFactory) {
this.factory = coffeeFactory;
}
// 点咖啡的功能
public Coffee orderCoffee() {
//调用点咖啡的方法,会返回一个对应工厂的咖啡
Coffee coffee = factory.createCoffee();
// 加配料开始生产咖啡
coffee.addMilk();
coffee.addSugar();
//咖啡生产完成,把对象返回
return coffee;
}
}
测试使用
TestFactoryMethod.java 测试工厂方法模式,模拟了两个用户过来买不同的产品
public class TestFactoryMethod {
public static void main(String[] args) {
// 客户过来买了一杯美式咖啡
System.out.println("小明买美式咖啡");
// 创建咖啡店
CoffeeStore coffeeStore = new CoffeeStore();
//设置咖啡工厂
coffeeStore.setFactory(new AmericanCoffeeFactory());
//订购咖啡
Coffee coffee = coffeeStore.orderCoffee();
//将咖啡给小明
System.out.println(coffee.getName());
//又有新客户过来点了杯拿铁咖啡
System.out.println("小美过来买拿铁咖啡");
//设置咖啡的工厂
coffeeStore.setFactory(new LatteCoffeeFactory());
//订购咖啡
Coffee coffee2 = coffeeStore.orderCoffee();
//将咖啡给小明
System.out.println(coffee2.getName());
}
}