首先一个大前提,这些“商品”都有统一的标准和行为(因为不知道具体要的哪个实现类,所以要有个抽象类或者接口,因此需要统一的标准和行为)。
所以首先设计抽象类或者接口
public abstract class Animal {
private String name ="animals";
//getName()和say()可以写成抽象的,但是这么写可以保证即使拿不到对应的产品,也有默认的方法实现。
public void say(){
System.out.println(name);
}
public String getName() {
return name;
}
}
对应的Bean
//这里使用@Component是要配合@Autowried实现,所以要先注入到Spring容器中。
@Component
public class Cat extends Animal{
//赋初值Cat
@Value("Cat")
private String name;
//替换掉父类中getName()方法
public String getName() {
return name;
}
}
//同上
@Component
public class People extends Animal{
@Value("People")
private String name;
public String getName() {
return name;
}
}
工厂实现
@Service
public class DeptServiceImpl {
@Autowired
DeptMapper deptMapper;
@Autowired
public void init(List<Animal> animals){
for(Animal animal:animals){
System.out.println(animal.getName());
}
}
}
@Service
public class DeptServiceImpl{
@Autowired
DeptMapper deptMapper;
//存储对应的Bean
public HashMap<String,Animal> beans = new HashMap<>();
//Spring会将所有实现Animal的Bean都注入到List<Animal>里面来,然后通过beans 去接收,这里使用static是可以在别的地方也使用。
@Autowired
public void init(List<Animal> animals){
for(Animal animal:animals){
beans.put(animal.getName(),animal);
}
}
}
最后获取对应的Animals
@RestController
public class AnimalController {
@Autowired
DeptService deptService;
@GetMapping("/{name}")
public Animal getCat(@PathVariable("name") String name){
return new JsonObject(deptService.getAnimal(name), CodeAndMsgEnum.success.getCodeAndMsg());
}
}
最后看下效果
可以看到已经实现了工厂模式了,在该场景中,其实通过获取到不同的bean,也能通过say()方法执行对应的方法。所以这种工厂模式,其实也可以用来编写统一的Service层入口,然后再通过该入口执行对应的不同Service实现。 也可以用来实现一小部分统一的Service层的实现,总之根据业务需要,灵活使用。