工厂模式
经常在博客上可以看到工厂模式的demo实例,但是在实际的项目应用中工厂模式到底应该怎么用呢,最近恰好有这样的应用场景,就自己动手实现了一下,在这里拿出来跟大家一起学习吧
说明下这里的代码运行环境是springcloud,这里有一个对ApplicationContextAware的实现来获取spring context,从这里获取spring管理的bean对象
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext context;
public static <T> T getBean(String beanName) {
return (T) context.getBean(beanName);
}
public static <T> T getBean(Class clazz) {
return (T) context.getBean(clazz);
}
public static <T> Map<String, T> getBeans(Class<T> clazz) {
return context.getBeansOfType(clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}
然后重点
public class MerchantStoreFactory {
public static Map<String,MerchantStoreInfoService> getMerchantStoreService() {
return ApplicationContextUtil.getBeans(MerchantStoreInfoService.class).values().stream()
.collect(Collectors.toMap(MerchantStoreInfoService::getMerchant, Function.identity()));
}
}
public abstract class MerchantStoreInfoService {
public abstract String getMerchant();
public String genSign(Map<String,String> params,String key,String secret){
//验签的一般实现
return "";
}
/**
* 查询商户门店信息
*/
public List queryMerchantStoreInfo(String merchant, Map data){
String json = this.packageParams(merchant,data);
List result = this.queryStore(json);
return result;
}
//组织参数
protected abstract String packageParams(String merchant,Map data);
//查询
protected abstract List queryStore(String json);
}
下边就是不同商户的具体实现了
@Service
public class MerchantStoreInfoJKLServiceImpl extends MerchantStoreInfoService {
@Override
public String getMerchant() {
return "商户AAA";
}
@Override
protected String packageParams(String merchant, Map data) {
//商户AAA的具体实现
return JSONObject.toJSONString(params);
}
@Override
protected List query(String json) {
//商户AAA的具体实现
return Lists.newArrayList();
}
}
@Service
public class MerchantStoreInfoJKLServiceImpl extends MerchantStoreInfoService {
@Override
public String getMerchant() {
return "商户BBB";
}
@Override
protected String packageParams(String merchant, Map data) {
//商户BBB的具体实现
return JSONObject.toJSONString(params);
}
@Override
protected List query(String json) {
//商户BBB的具体实现
return Lists.newArrayList();
}
}
代码中的调用
MerchantStoreInfoService merchantStoreInfoService = MerchantStoreFactory.getMerchantStoreService().get(merchant);