设计模式系列之工厂模式-抽象工厂模式【八】

1. 前言

推荐阅读:设计模式系列之工厂模式-工厂方法模式【七】

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类动物,可能会导致系统中存在大量的工厂类。此时,可以考虑将一些相关的动物组成一个动物族,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。

比如动物中可以分为猫科、犬科等,猫、狗、老虎、豹子、鬣狗等都是具体的动物类。看下工厂方法模式和抽象工厂模式的区别:

  • 工厂方法模式:工厂方法模式中每个工厂只生产一类动物,那么就有猫工厂、狗工厂、老虎工厂等很多工厂
  • 抽象工厂模式:抽象工厂中每个工厂生产由多种动物组成的"动物族",那么就只需要有猫科工厂、犬科工厂就够了,猫科工厂可以生产猫科下的动物:猫咪、老虎、豹子;犬科工厂可以生产犬科下的动物:狗、鬣狗等。

由此看出使用抽象工厂模式极大地减少了系统中类的个数。

2. 定义

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种动物,它负责创建一族动物。抽象工厂模式定义如下:

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。

3. 模式结构

在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的动物,这些动物构成了一个动物族。在抽象工厂模式结构中包含如下几个角色:

  • AbstractFactory(抽象工厂):它声明了一组用于创建一族动物的方法,每一个方法对应一种动物。
  • ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建动物的方法,生成一组具体动物,这些动物构成了一个动物族。
  • AbstractAnimal(抽象动物):它为每种动物声明接口,在抽象动物中声明了动物所具有的业务方法。
  • ConcreteAnimal(具体动物):它定义具体工厂生产的具体动物对象,实现抽象动物接口中声明的业务方法。

4. 模式伪代码

在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或者具体类,其典型代码如下所示:

public abstract class AbstractFactory {

    public abstract AbstractAnimalA createAnimalA();

    public abstract AbstractAnimalB createAnimalB();

    public abstract AbstractAnimalC createAnimalC();
}

具体工厂实现了抽象工厂,每一个具体的工厂方法可以返回一个特定的动物对象,而同一个具体工厂所创建的动物对象构成了一个动物族。对于每一个具体工厂类,其典型代码如下所示:

public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractAnimalA createAnimalA() {
        return new ConcreteAnimalA();
    }

    @Override
    public AbstractAnimalB createAnimalB() {
        return new ConcreteAnimalB();
    }

    @Override
    public AbstractAnimalC createAnimalC() {
        return new ConcreteAnimalC();
    }
}

你可能感兴趣的:(java)