一、模式结构
1. 工厂模式
在开始之前,让我们了解一下什么是工厂模式?
在程序开发中,通常会涉及到相似对象的实例创建,而没有统一的关联却很难对程序进行维护管理。举个简单例子,系统中存在 Dog
与 Cat
两个类,且二者都包含了 roar()
方法,不同之处仅方法内部实现。随着系统需求的增长,后续需求中可能新增其它动物类,从而将导致在实例化时需要关注具体的类实现。
在工厂模式中,通过定义一个公共接口来创建对象,然后由子类决定实例化哪个类,即可使用工厂类来创建对象而不需要了解具体实现类的细节。同样以上述的示例为准,通过定义抽象接口类 Animal
并定义接口方法 roar()
,子类只需实现并重写接口方法即可。在实例化对象时,通过传入的类型决定具体的实例化类,而不必关注具体的业务实现。
2. 目标效果
在 Spring Boot
中的一大核心即全局的 Bean
对象容器管理,因此可以将工厂模式与之进一步结合。
其核心在于利用 Spring
的 Bean
容器分组效果,将工厂类的不同实例化对象注入 Bean
容器,当需要创建对象时,直接通过 Bean
容器获取即可。
二、代码实现
1. 常量定义
为了提供程序的可读性与可维护性,此处将后续涉及的常量统一外置定义。
public class Const {
public static final String ANIMAL_DOG = "dog";
public static final String ANIMAL_CAT = "cat";
}
2. 工厂实现
这里同样以基础的动物工厂为例,定义了接口 Animal
,同时定义了两个实现类 Dog
与 Cat
。
需要注意此处的两个实现类需要通过 @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();
}
}