Spring 实现优雅的工厂模式


一、模式结构

1. 工厂模式

在开始之前,让我们了解一下什么是工厂模式?

在程序开发中,通常会涉及到相似对象的实例创建,而没有统一的关联却很难对程序进行维护管理。举个简单例子,系统中存在 DogCat 两个类,且二者都包含了 roar() 方法,不同之处仅方法内部实现。随着系统需求的增长,后续需求中可能新增其它动物类,从而将导致在实例化时需要关注具体的类实现。

在工厂模式中,通过定义一个公共接口来创建对象,然后由子类决定实例化哪个类,即可使用工厂类来创建对象而不需要了解具体实现类的细节。同样以上述的示例为准,通过定义抽象接口类 Animal 并定义接口方法 roar(),子类只需实现并重写接口方法即可。在实例化对象时,通过传入的类型决定具体的实例化类,而不必关注具体的业务实现。

2. 目标效果

Spring Boot 中的一大核心即全局的 Bean 对象容器管理,因此可以将工厂模式与之进一步结合。

其核心在于利用 SpringBean 容器分组效果,将工厂类的不同实例化对象注入 Bean 容器,当需要创建对象时,直接通过 Bean 容器获取即可。

二、代码实现

1. 常量定义

为了提供程序的可读性与可维护性,此处将后续涉及的常量统一外置定义。

public class Const {
    public static final String ANIMAL_DOG = "dog";

    public static final String ANIMAL_CAT = "cat";
}

2. 工厂实现

这里同样以基础的动物工厂为例,定义了接口 Animal,同时定义了两个实现类 DogCat

需要注意此处的两个实现类需要通过 @Service 注入 Bean 对象至 Spring 容器中,并指定了 Bean 名称。

public interface Animal {
    void roar();
}


@Service(Const.ANIMAL_DOG)
public interface Dog implements Animal {
    public void roar() {
        System.out.println("Dog roar");
    }
}


@Service(Const.ANIMAL_CAT)
public interface Cat implements Animal {
    public void roar() {
        System.out.println("Cat roar");
    }
}

3. 示例演示

完成上述步骤后即可通过 Map@Autowired 获取对象实例,依托于 Spring 容器实现了类似工厂与 SPI 结合的效果。

@Service
public class TestService {

    @Autowired
    private Map<String, Animal> animalMap;

    public void test(String name) {
        // --> Dog roar
        Animal dog = animalMap.get(Const.ANIMAL_DOG);
        dog.roar();

        // --> Cat roar
        Animal cat = animalMap.get(Const.ANIMAL_CAT);
        cat.roar();
    }
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录