需求场景: 现需计划开发一个支付功能模块,初步有微信支付与支付宝支付,但随着后续业务的发展,不排除有新的支付方式。对外提供的接口名一致(/pay?type=1或者/pay?type=2)
未应用工厂模式
思路:
- 定义一个枚举类,1:微信支付; 2:支付宝支付
- 定义一个通用接口,两个具体的实现类
接口代码
public interface PayService {
public void pay();
}
public class WeChatPayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("微信支付...");
}
}
public class AlipayPayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("支付宝支付...");
}
}
客户端代码
public static void main(String[] args) {
int flag = 2;
if(1 == PayStyleEnum.WECHART.getCode()){
new WeChatPayServiceImpl().pay();
}else if(2 == PayStyleEnum.ALIPAY.getCode()){
new AlipayPayServiceImpl().pay();
}
}
代码缺陷: 当有新的支付方式时,必须得修改原来的代码
工厂模式处理方案一:简单工厂模式
工厂模式处理方案一:简单工厂模式 + 反射
接口代码
public interface PayService {
public void pay();
}
public class WeChatPayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("微信支付...");
}
}
public class AlipayPayServiceImpl implements PayService{
@Override
public void pay() {
System.out.println("支付宝支付...");
}
}
//枚举
public enum PayStyleEnum {
WECHART(1,WeChatPayServiceImpl.class),
ALIPAY(2,AlipayPayServiceImpl.class)
;
private int code;
private Class classes;
public int getCode() {
return code;
}
public Class getClasses() {
return classes;
}
PayStyleEnum(int code, Class classes) {
this.code = code;
this.classes = classes;
}
public static Class getClassesByCode(int code){
for (PayStyleEnum e : PayStyleEnum.values()) {
if(code == e.getCode()){
return e.getClasses();
}
}
return null;
}
}
工厂类
public class PayFactory {
public Class create(int code){
return PayStyleEnum.getClassesByCode(code);
}
}
客户端
public class Test {
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
PayService payService = (PayService) new PayFactory().create(1).newInstance();
payService.pay();
}
}