使用@Autworied实现工厂模式

使用@Autworied实现工厂模式,第1张

使用@Autworied实现工厂模式

首先一个大前提,这些“商品”都有统一的标准和行为(因为不知道具体要的哪个实现类,所以要有个抽象类或者接口,因此需要统一的标准和行为)。
所以首先设计抽象类或者接口

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 HashMap beans = 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层的实现,总之根据业务需要,灵活使用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5713320.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存