前言
下面的示例展示了 SpringBoot 中如何使用工厂模式,该示例通过 ApplicationContext 直接获取 Spring 容器中所有 Animal 的 Bean,然后将它们存储在 animalMap 中,使用时直接从 Map 中获取实例。
另一种工厂模式可参考我另一篇文章 :SpringBoot 工厂模式自动注入到Map
一、建立父类
java
public abstract class Animal {
public abstract void makeSound();
public abstract String getType();
}
二、两个子类
java
@Component
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
@Override
public String getType() {
return "cat";
}
}
java
@Component
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Wang!");
}
@Override
public String getType() {
return "dog";
}
}
三、工厂类注入到 map 里
java
@Component
public class AnimalFactory implements ApplicationContextAware, InitializingBean {
private final Map<String, Animal> animalMap = new ConcurrentHashMap<>();
private ApplicationContext appContext;
public Animal getAnimal(String animalType) {
Animal animal = this.animalMap.get(animalType);
if (animal == null) {
throw new IllegalArgumentException("Unsupported animal type: " + animalType);
}
return animal;
}
@Override
public void afterPropertiesSet() throws Exception {
Map<String, Animal> beansOfType = this.appContext.getBeansOfType(Animal.class);
beansOfType.values().forEach(animal -> animalMap.put(animal.getType(), animal));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.appContext = applicationContext;
}
}
四、测试
java
@Autowired
private AnimalFactory animalFactory;
public void printSound() throws Exception {
Animal animal_1 = animalFactory.getAnimal("dog");
animal_1.makeSound(); // 输出 "Wang!"
Animal animal_2 = animalFactory.getAnimal("cat");
animal_2.makeSound(); // 输出 "Miao!"
}