抽象工厂方法设计模式的新思路

14 阅读1分钟

抽象工厂的新思路,之前看了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();
    }
}