设计模式之抽象工厂模式

    xiaoxiao2022-07-07  189

    什么是抽象工厂模式

    抽象工厂模式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(); } }

    输出结果如下

    生产奥迪发动机 生产奥迪变速箱 生产奥迪底盘
    最新回复(0)