创建一个策略接口
public interface FatherFactory{
//获取一个标识,用来标识每个具体策略
String getNo();
//实现方法
void method(Object object);
}
创建多个具体策略去继承接口
@Component
public class ChildFactoryA implements FatherFactory {
//返回一个唯一编码,用来标识该具体策略
@Override
public String getNo() {
return "编码1";
}
@Override
public void method(Object obejct) {
...
}
}
@Component
public class ChildFactoryA implements FatherFactory {
//返回一个唯一编码,用来标识该具体策略
@Override
public String getNo() {
return "编码1";
}
@Override
public void method(Object obejct) {
...
}
}
创建一个管理类,用于管理上述策略,在服务启动时,将所有子工厂都初始化加入到map中,并以每个具体策略生成的唯一编码作为key,具体策略作为value,这样在使用的时候就能根据传入的编码获取对应的实现;
@Component
public class FactoryHandler {
@Autowired
private ApplicationContext applicationContext;
private Map<String, FatherFactory> map = new HashMap<>();
//该注解用于表示服务一启动就执行一下方法,并且只能执行一次
@PostConstruct
public void addFactory(){
Map<String, FatherFactory> maps = applicationContext.getBeansOfType(FatherFactory.class);
for (FatherFactory factory:maps.values()){
map.put(factory.getBusinessRelateEnum().getValue(),factory);
};
}
public FatherFactory getFactory(String businessCode){
FatherFactory factory = map.get(businessCode);
if (factory==null){
throw new Exception();
}
return factory;
}
}
调用实现方法,根据传入的编码,就能获得对应的具体策略,来实现不同的方法
@Service
public class FactoryService{
@Autowired
private FactoryHandler factoryHandler ;
public void getThing(Object obejct) {
FatherFactory factory = factoryHandler.getFactory("编号");
factory.method(obejct);
}
网友评论