Abstract Factory - 抽象工厂设计模式

10 阅读2分钟

什么是抽象工厂模式?

抽象工厂是工厂模式的进一步抽象,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的产品对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些产品对象的通用接口。抽象工厂模式将一组产品对象的实现细节与他们的一般使用分离开来。

抽象工厂模式是在工厂方法模式基础上进一步进行抽象。我们在前一篇工厂方法中的示例,奥迪汽车和奔驰汽车,仅仅只有品牌一个维度,如果再加上一个型号的维度会怎样?例如每个品牌都有A,B,C三个等级的产品,那么具体产品类的数量会变成2 * 3 = 6(个),对应地,具体工厂类的数量将会变成6个。

优缺点

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:扩展困难,如果产品维度要新增一项,意味着抽象的工厂类和具体工厂类都要修改。

示例

抽象工厂模式其实是对工厂做了一层抽象,抽象的工厂中将包含创建各等级产品的接口方法,具体实现则丢给各个具体工厂对象去处理。

interface AbstractCarFactory {
    Car produceAClass();
    Car produceBClass();
    Car produceCClass();
}

class BenzCarFactory implements AbstractCarFactory{
    @Override
    public Car produceAClass() {
        return new BenzAClassCar();
    }
    @Override
    public Car produceBClass() {
        return new BenzBClassCar();
    }
    @Override
    public Car produceCClass() {
        return new BenzCClassCar();
    }
}
// Audi 示例同上省略

产品类

abstract class Car {
    abstract void run();
}

class BenzAClassCar extends Car {
    @Override
    void run() {
        System.out.println("Benz A class car run...");
    }
}

class BenzBClassCar extends Car {
    @Override
    void run() {
        System.out.println("Benz B class car run...");
    }
}

class BenzCClassCar extends Car {
    @Override
    void run() {
        System.out.println("Benz C class car run...");
    }
}

public static void main(String[] args) {
    final AbstractCarFactory factory = new BenzCarFactory();
    factory.produceAClass().run();
    factory.produceBClass().run();
    factory.produceCClass().run();
}

Output

Benz A class car run...
Benz B class car run...
Benz C class car run...