首先一个大前提,这些“商品”都有统一的标准和行为(因为不知道具体要的哪个实现类,所以要有个抽象类或者接口,因此需要统一的标准和行为)。
所以首先设计抽象类或者接口
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 animals){ for(Animal animal:animals){ System.out.println(animal.getName()); } } }
@Service public class DeptServiceImpl{ @Autowired DeptMapper deptMapper; //存储对应的Bean public HashMapbeans = new HashMap<>(); //Spring会将所有实现Animal的Bean都注入到List里面来,然后通过beans 去接收,这里使用static是可以在别的地方也使用。 @Autowired public void init(List 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层的实现,总之根据业务需要,灵活使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)