设计模式之抽象工厂模式

什么是抽象工厂模式

抽象工厂模式Abstract Factory Pattern提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式。

在前面我们讲到了简单工厂模式工厂方法模式,简单工厂只提供了一个工厂类,根据传入参数,实现了所有对象的创建逻辑,当系统产品日益增多的时候,就需要改变工厂类,这也就违反了OCP原则。

后面又衍生除了工厂方法模式,工厂方法是抽象出了一个创建产品对象的工厂接口,这个类不再负责产品对象的创建,具体的创建工作交给实现类去做,通常情况下工厂类和产品类是一一对应的,这个工厂就负责生产这个产品。工厂方法完全符合了OCP原则,实现了对扩展开发,对修改关闭。但是假如我们需要增加一个产品,这个时候我们就需要创建一个对应的工厂类。对开发者而言增加了额外的工作量,对使用者而言,我需要知道具体的工厂类,提高了复杂度,没有简单工厂那样使用简便。所以要根据实际业务场景来选用相应的设计模式。

接下来我就来讲解另一种工厂模式-抽象工厂Abstract Factory),用来解决多个产品族的结构问题。

下面我将模拟一个这样的场景,有一个汽车工厂(ICarFactory),它可以用来生产汽车发动机(IEngine)、变速箱(IGearbox)、底盘(IChassis)等配件,奥迪工厂(AudiFactory)和奔驰工厂(BenzFactory)分别都实现了汽车工厂,可分别生产奥迪汽车配件和奔驰汽车配件。假如这个时候我们要生产宝马的汽车配件,只需要新建一个宝马工厂去实现汽车工厂就可以了。

UML图如下

设计模式之抽象工厂模式

定义一个汽车工厂接口ICarFactory

public interface ICarFactory {
    /**
     * 生产发动机
     *
     * @return
     */
    IEngine productionEngine();

    /**
     * 生产变速箱
     *
     * @return
     */
    IGearbox productionGearbox();

    /**
     * 生产底盘
     *
     * @return
     */
    IChassis productionChassis();
}

定义生产汽车发动机(IEngine)、变速箱(IGearbox)、底盘(IChassis)等接口

public interface IEngine {
    /**
     * 生产发动机
     */
    void produce();
}

public interface IGearbox {
    /**
     * 生产变速箱
     */
    void produce();
}

public interface IChassis {
    /**
     * 生产底盘
     */
    void produce();
}

定义用于生产奥迪汽车配件的实现类

public class AudiEngine implements IEngine {
    @Override
    public void produce() {
        System.out.println("生产奥迪发动机");
    }
}

public class AudiGearbox implements IGearbox {
    @Override
    public void produce() {
        System.out.println("生产奥迪变速箱");
    }
}

public class AudiChassis implements IChassis {
    @Override
    public void produce() {
        System.out.println("生产奥迪底盘");
    }
}

定义用于生产奔驰汽车配件的实现类

public class BenzEngine implements IEngine {
    @Override
    public void produce() {
        System.out.println("生产奔驰发动机");
    }
}

public class BenzGearbox implements IGearbox {
    @Override
    public void produce() {
        System.out.println("生产奔驰变速箱");
    }
}

public class BenzChassis implements IChassis {
    @Override
    public void produce() {
        System.out.println("生产奔驰底盘");
    }
}

定义奥迪工厂(AudiFactory)和奔驰工厂(BenzFactory)分别都实现了汽车工厂

public class AudiFactory implements ICarFactory {

    @Override
    public IEngine productionEngine() {
        return new AudiEngine();
    }

    @Override
    public IGearbox productionGearbox() {
        return new AudiGearbox();
    }

    @Override
    public IChassis productionChassis() {
        return new AudiChassis();
    }
}
public class BenzFactory implements ICarFactory {

    @Override
    public IEngine productionEngine() {
        return new BenzEngine();
    }

    @Override
    public IGearbox productionGearbox() {
        return new BenzGearbox();
    }

    @Override
    public IChassis productionChassis() {
        return new BenzChassis();
    }
}

测试

public class Test {

    public static void main(String[] args) {
        ICarFactory audiFactory = new AudiFactory();

        audiFactory.productionEngine().produce();
        audiFactory.productionGearbox().produce();
        audiFactory.productionChassis().produce();
    }
}


输出结果如下

生产奥迪发动机
生产奥迪变速箱
生产奥迪底盘