《一天一模式》— 抽象工厂模式

原创
2020/05/21 00:03
阅读数 221

一、抽象工厂模式的概念

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

二、什么时候使用抽象工厂模式

抽象工厂稍微有些复杂,但是使用场景却很单一:如果你有一族对象,纬度大于一,那么可以考虑使用抽象工厂来创建对象。

举个例子来说明什么是纬度大于一:

  • 奔驰有SRV和SUV,奥迪也有SRV和SUV,这就是两个纬度,汽车品牌 + 车辆种类;
  • 华为有手机和路由器,小米也有手机和路由器,这也是两个纬度,设备品牌 + 设备类型;

所以说,在有纬度大于一的一族对象时,可以考虑使用抽象工厂模式。

下面来看看怎么用Java实现抽象工厂模式。

三、如何使用抽象工厂模式

抽象工厂如何解决这种复杂对象的创建?我是这么理解的:

  • 首先,抽象工厂也是可以理解为有两个纬度,工厂的数量就是对象族群某一纬度的数量,比如车辆的例子中,汽车品牌有奔驰和奥迪,那么抽象工厂的数量就是2;
  • 其次,每个抽象工厂的方法数量就是另一个纬度的数量,例如车辆类型分为SRV和SUV,所以每个抽象工厂都有两个方法,即createSUV和createSRV;

下面就以汽车的例子为例,看看如何实现:

代码如下:

// 对象族定义
public class Audi {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


public class AudiSRV extends Audi { }

public class AudiSUV extends Audi { }

public class Benz {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class BenzSRV extends Benz { }

public class BenzSUV extends Benz { }

// 工厂定义
// 工厂数量等于 汽车类型的数量
// 工厂内的方法数量等于 汽车品牌的数量
// SRV工厂可以生产奔驰的SRV和奥迪的SRV
// SUV工厂可以生产奔驰的SUV和奥迪的SUV

public interface VehicleFactory {

    Audi createAudi();

    Benz createBenz();

}

public class SRVFactory implements VehicleFactory {

    public Audi createAudi() {
        Audi audi = new AudiSRV();
        audi.setName("AudiSRV");
        return audi;
    }

    public Benz createBenz() {
        Benz benz = new BenzSRV();
        benz.setName("BenzSRV");
        return benz;
    }

}

public class SUVFactory implements VehicleFactory {

    public Audi createAudi() {
        Audi audi = new AudiSUV();
        audi.setName("AudiSUV");
        return audi;
    }

    public Benz createBenz() {
        Benz benz = new BenzSUV();
        benz.setName("BenzSUV");
        return benz;
    }

}

根据套路,工厂数量等于 汽车类型的数量,工厂内的方法数量等于 汽车品牌的数量。所以,SRV工厂可以生产奔驰的SRV和奥迪的SRV,SUV工厂可以生产奔驰的SUV和奥迪的SUV。

也可以反过来,定义SUV类型的两种车辆和SRV类型的两种车辆,那么工厂就变换为Benz工厂(生产奔驰SUV和SRV),Audi工厂(生产奥迪SUV和SRV),这样可能更合理,但是要从具体业务场景来区分。抽象工厂的类型很灵活。

四、总结

抽象工厂模式,可以在理解需求方面需要慢慢琢磨,但是使用场景很单一,代码实现也很简单。它有如下优点:

  • 高内聚:抽象工厂模式隔离了具体对象的生产,客户端只调用工厂创建对象即可(工厂类都有该优点);
  • 扩展性强:增加新的工厂和对象,无须修改现有代码,符合开闭原则;

以上就是我对抽象工厂模式的一些理解,有不足之处请大家指出,谢谢。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部