为什么使用工厂模式:
工厂模式是将获取对象的实例交给工厂,由工厂根据提供的类型返回给你想要的类型,便于对对象的扩展和维护;
常用发送验证码例子
我们常用验证码来验证用户的注册,可以使用手机验证码或者邮箱验证码、其它验证码
上一个类图
首先创建一个接口声明发送验证码接口
public interface SendCodeService {
/**
* 设置tag
* @return
*/
public String setTag();
/**
* 发送验证码
* @param userRequestBean
* @return
*/
public Boolean sendCode(UserRequestBean userRequestBean);
}
创建具体要发送验证码的类
发送手机验证码
@Service("phoneSendCodeService")
public class PhoneSendCodeServiceImpl implements SendCodeService {
@Override
public String setTag() {
return "phone";
}
@Override
public Boolean sendCode(UserRequestBean userRequestBean) {
return true;
}
}
发送邮箱验证码
@Service("mailSendCodeService")
public class MailSendCodeServiceImpl implements SendCodeService {
@Override
public String setTag() {
return "mail";
}
@Override
public Boolean sendCode(UserRequestBean userRequestBean) {
return true;
}
}
其它发送验证码
@Service("otherSendCodeService")
public class OtherSendCodeServiceImpl implements SendCodeService {
@Override
public String setTag() {
return "other";
}
@Override
public Boolean sendCode(UserRequestBean userRequestBean) {
return true;
}
}
设置工厂
@Component("sendCodeServiceFactory")
public class SendCodeServiceFactory {
@Autowired
private List<SendCodeService> sendCodeService;
public SendCodeService getInstance(String tag){
Optional<SendCodeService> optional=sendCodeService.stream().filter(services -> services.setTag().equals(tag)).findFirst();
if(optional.isPresent()){
return optional.get();
}else{
log.error("command is null, please check you tag.");
throw new IllegalArgumentException("command is null, please check you tag.");
}
}
}
使用
SendCodeService sendCodeService=sendCodeServiceFactory.getInstance(tag);
System.out.println(sendCodeService.sendCode(userRequestBean));
以上只是简单的工厂模式,还有抽象工厂模式,只是在工厂上增加抽象的工厂实现该工厂,道理一样;
如果再需要增加其它的发送验证码方案,则继续实现SendCodeService接口,实现接口方法,增加tag即可