抽象工厂的新思路,之前看了AQS的tryAquire()方法的实现,我突然有一个想法,就是对于抽象工厂方法是否可以使用以上思路重构,使用模板方法+选择性重写,这样可以解决不同工厂产品不一致的情况。
// 抽象产品类保持不变
abstract class Car {
public abstract void drive();
}
abstract class Bike {
public abstract void ride();
}
// 具体产品类保持不变
class ACar extends Car {
@Override
public void drive() {
System.out.println("A drive car");
}
}
//没有ABike
class BCar extends Car {
@Override
public void drive() {
System.out.println("B drive car");
}
}
class BBike extends Bike {
@Override
public void ride() {
System.out.println("B ride Bike");
}
}
// 改进后的抽象工厂,采用AQS的设计思想
abstract class Factory {
// 模板方法 - 创建Car,类似AQS的acquire()
public final Car createCar() {
Car car = tryCreateCar();
if (car == null) {
throw new UnsupportedOperationException("该工厂不支持创建Car");
}
return car;
}
// 模板方法 - 创建Bike
public final Bike createBike() {
Bike bike = tryCreateBike();
if (bike == null) {
throw new UnsupportedOperationException("该工厂不支持创建Bike");
}
return bike;
}
// 可选的创建方法,类似AQS的tryAcquire()
protected Car tryCreateCar() {
return null; // 默认不支持
}
protected Bike tryCreateBike() {
return null; // 默认不支持
}
}
// A工厂只实现Car的创建
class AFactory extends Factory {
@Override
protected Car tryCreateCar() {
return new ACar();
}
// 不实现tryCreateBike(),表示不支持创建Bike
}
// B工厂实现两种产品的创建
class BFactory extends Factory {
@Override
protected Car tryCreateCar() {
return new BCar();
}
@Override
protected Bike tryCreateBike() {
return new BBike();
}
}
// 使用示例
class Main {
public static void main(String[] args) {
// 使用A工厂(只生产Car)
Factory aFactory = new AFactory();
Car aCar = aFactory.createCar(); // 成功
// Bike aBike = aFactory.createBike(); // 抛出异常
// 使用B工厂(生产Car和Bike)
Factory bFactory = new BFactory();
Car bCar = bFactory.createCar(); // 成功
Bike bBike = bFactory.createBike(); // 成功
aCar.drive();
bCar.drive();
bBike.ride();
}
}