核心思想
- 解决工厂模式每个产品都需要创建对应的工厂,后续工厂类过多的情况
- 强调相关的具体类组成一个具体的家族,由同一个工厂类来生产
优缺点
优点
- 多个对象被设计到一起时,保证使用方只使用同一个产品族中得对象
- 产品等级结构扩展容易,只需要添加新的产品类和工厂类即可,比如增加抖音支付和退款
缺点
- 增加了系统的抽象性和理解难度
- 产品族扩展困难,增加一系列的某个产品,抽象的工厂和产品都要修改代码
代码示例
支付抽象类
/**
* 支付抽象类
*/
public interface PayFactory {
/**
* 订单支付
*/
void orderPay();
}
退款抽象类
/**
* 退款抽象类
*/
public interface RefundFactory {
/**
* 订单退款
*/
void orderRefund();
}
订单抽象工厂
/**
* 订单抽象工厂
*/
public interface OrderFactory {
/**
* 获取支付工厂
* @return
*/
PayFactory getPayFactory();
/**
* 获取退款工厂
* @return
*/
RefundFactory getRefundFactory();
}
微信支付产品类、退款产品类
public class WechatPay implements PayFactory{
@Override
public void orderPay() {
System.out.println("微信支付");
}
}
public class WechatRefund implements RefundFactory{
@Override
public void orderRefund() {
System.out.println("微信退款");
}
}
支付宝支付产品类、退款产品类
public class AliPay implements PayFactory{
@Override
public void orderPay() {
System.out.println("支付宝支付");
}
}
public class AliRefund implements RefundFactory{
@Override
public void orderRefund() {
System.out.println("支付宝退款");
}
}
微信支付工厂
/**
* 微信支付工厂
*/
public class WechatOrderFactory implements OrderFactory{
@Override
public PayFactory getPayFactory() {
return new WechatPay();
}
@Override
public RefundFactory getRefundFactory() {
return new WechatRefund();
}
}
支付宝支付工厂
/**
* 阿里支付工厂
*/
public class AliOrderFactory implements OrderFactory{
@Override
public PayFactory getPayFactory() {
return new AliPay();
}
@Override
public RefundFactory getRefundFactory() {
return new AliRefund();
}
}
工厂生产器
/**
* 工厂生产器,传参生产对应的子工厂
*/
public class FactoryProducer {
public static OrderFactory getFactory(String type) {
if (type.equalsIgnoreCase("WECHAT")) {
return new WechatOrderFactory();
} else if (type.equalsIgnoreCase("ALI")) {
return new AliOrderFactory();
}
return null;
}
}
测试
public class AppRun {
public static void main(String[] args) {
OrderFactory orderFactory = FactoryProducer.getFactory("ALI");
orderFactory.getPayFactory().orderPay();
orderFactory.getRefundFactory().orderRefund();
}
}
public class AppRun {
public static void main(String[] args) {
OrderFactory orderFactory = FactoryProducer.getFactory("WECHAT");
orderFactory.getPayFactory().orderPay();
orderFactory.getRefundFactory().orderRefund();
}
}