工厂模式分为简单工厂,工厂方法,抽象工厂。今天探讨简单工厂模式
- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,属于创建型模式,但它不属于GOF,23种设计模式。
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行 为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会 使用到工厂模式
业务需求:
现在登录方式分为oauth2,jwt,cas。现在有一张模板基础表叫ids_app_info
,三张与之对应的模板详情表:ids_app_jwt_template、ids_app_cas_template、ids_app_oauth_template
。添加一个模板的应用时会有基础数据和模板详情数据。那么,基础数据插入ids_app_info后,具体模板详情数据如何插入对应的模板表?
看简单工厂模式的实现:
先看类图:
作用是存放对象和取出对象
@Component
public class TemplateFactory {
private ConcurrentHashMap<String, TemplateService> map = new ConcurrentHashMap<>();
public void setTemplate(String type, TemplateService templateService) {
map.putIfAbsent(type, templateService);
}
public TemplateService getTemplate(String type) {
return map.get(type);
}
}
public interface TemplateService {
void insertTemplate(String templateStr);
}
抽象类隔开父接口与实现类的目的是为了写一些公共的方法在此。
public abstract class AbstractTemplateService implements TemplateService{
}
@Service("idsAppCasTemplateService")
public class IdsAppCasTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
@Resource
private TemplateFactory templateFactory;
@Resource
private IdsAppCasTemplateDao casTemplateDao;
@Override
public void afterPropertiesSet() throws Exception {
templateFactory.setTemplate(TemplateEnum.CAS_TEMPLATE.getCode(), this);
}
@Override
public void insertTemplate(String templateStr) {
IdsAppCasTemplateEntity casTemplateEntity = JSON.parseObject(templateStr, IdsAppCasTemplateEntity.class);
casTemplateDao.insert(casTemplateEntity);
}
}
@Service("idsAppJwtTemplateService")
public class IdsAppJwtTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
@Resource
private TemplateFactory templateFactory;
@Resource
private IdsAppJwtTemplateDao jwtTemplateDao;
@Override
public void afterPropertiesSet() throws Exception {
templateFactory.setTemplate(TemplateEnum.JWT_TEMPLATE.getCode(),this);
}
@Override
public void insertTemplate(String templateStr) {
IdsAppJwtTemplateEntity jwtTemplateEntity = JSON.parseObject(templateStr, IdsAppJwtTemplateEntity.class);
jwtTemplateDao.insert(jwtTemplateEntity);
}
}
@Service("idsAppOauthTemplateService")
public class IdsAppOauthTemplateServiceImpl extends AbstractTemplateService implements InitializingBean {
@Resource
private TemplateFactory templateFactory;
@Resource
private IdsAppOauthTemplateDao oauthTemplateDao;
@Override
public void afterPropertiesSet() throws Exception {
templateFactory.setTemplate(TemplateEnum.OAUTH_TEMPLATE.getCode(),this);
}
@Override
public void insertTemplate(String templateStr) {
IdsAppOauthTemplateEntity appOauthTemplate = JSON.parseObject(templateStr,IdsAppOauthTemplateEntity.class);
oauthTemplateDao.insert(appOauthTemplate);
}
}
@Override
public RespResult<Void> add(AppInfoDTO appInfoDTO) {
RespResult<Void> result = new RespResult<>();
ServiceTemplate.executeApiService(
getClass(),
AppSceneEnum.API_TEACHER_ADDTEACHER,
appInfoDTO,
result,
request -> {
IdsAppInfoEntity idsAppInfoEntity = new IdsAppInfoEntity();
BeanUtils.copyProperties(appInfoDTO,idsAppInfoEntity);
idsAppInfoMapper.insert(idsAppInfoEntity);
String templateType = appInfoDTO.getTemplateType();
//根据templateType获取对应的实现类,向上造型成父类(就是那个父接口)
TemplateService template = templateFactory.getTemplate(templateType);
//父类的对象点方法(子类是哪个实现类那么就会进入哪个实现类的方法)
template.insertTemplate(appInfoDTO.getTemplateStr());
});
return result;
}