工厂模式:工厂是创建型模式,它的作用就是创建对象。将对象统一管理,在业务不同时在调用不同的对象进行使用
策略模式:我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
这里将实现利用工厂模式和策略模式实现多种类型方式登陆,后期也利于拓展更多方式
一、首先创建工厂管理对象,这里管理的是不同的登陆对象
@Component
public class LoginBuildFactory {
/**
* 将登陆service对象统一管理
*/
@Resource
private Map<String, LoginService> strategyMap=new ConcurrentHashMap<>();
/**
* 不同登陆方式获取不同的登陆业务对象
* @param strategyName 登陆类型参数
* @return
*/
public LoginService getBuildNameByService(String strategyName){
LoginService loginService=strategyMap.get(strategyName);
if(ObjectUtils.isNull(loginService)){
throw new RuntimeException("未找到"+strategyName+"类型的服务");
}
return loginService;
}
}
二、创建两个不同登陆业务对象
//系统登陆
@Service(EnumLoginType.system)
public class LoginServiceImpl implements ILoginService {
@Override
public Map login(UserEntity entity) {
//TODO 登陆逻辑
return map;
}
}
//微信登陆
@Service(EnumLoginType.wx)
public class WxLoginServiceImpl implements ILoginService {
@Override
public Map wxLogin(UserEntity entity) {
//TODO 登陆逻辑
return map;
}
}
//接口
public interface ILoginService {
Map login(UserEntity entity);//登陆
}
启动项目时会使用单列模式创建这两个对象,并且被放在strategyMap这个map中进行管理
三、接口调用
@PostMapping("/login")
public Result list(@RequestBody UserEntity entity) {
//获取相关的业务bean
LoginBuildService loginService =buildFactory.getWxTemplateBodyBuildName(entity.getLoginType());
//登陆业务处理
Map map=loginService.login(entity);
return Result.ok(Map);
}
通过传入的登陆类型从map中取出对应的登陆对象,再通过当前对象调用登陆方法,简单实现工厂加策略模式