设计模式-抽象工厂模式

核心思想

  • 解决工厂模式每个产品都需要创建对应的工厂,后续工厂类过多的情况
  • 强调相关的具体类组成一个具体的家族,由同一个工厂类来生产


优缺点

优点

  • 多个对象被设计到一起时,保证使用方只使用同一个产品族中得对象
  • 产品等级结构扩展容易,只需要添加新的产品类和工厂类即可,比如增加抖音支付和退款

缺点

  • 增加了系统的抽象性和理解难度
  • 产品族扩展困难,增加一系列的某个产品,抽象的工厂和产品都要修改代码

代码示例

支付抽象类

java 复制代码
/**
 * 支付抽象类
 */
public interface PayFactory {

    /**
     * 订单支付
     */
    void orderPay();
}

退款抽象类

java 复制代码
/**
 * 退款抽象类
 */
public interface RefundFactory {

    /**
     * 订单退款
     */
    void orderRefund();
}

订单抽象工厂

java 复制代码
/**
 * 订单抽象工厂
 */
public interface OrderFactory {

    /**
     * 获取支付工厂
     * @return
     */
    PayFactory getPayFactory();

    /**
     * 获取退款工厂
     * @return
     */
    RefundFactory getRefundFactory();
}

微信支付产品类、退款产品类

java 复制代码
public class WechatPay implements PayFactory{

    @Override
    public void orderPay() {
        System.out.println("微信支付");
    }
}
java 复制代码
public class WechatRefund implements RefundFactory{
    @Override
    public void orderRefund() {
        System.out.println("微信退款");
    }
}

支付宝支付产品类、退款产品类

java 复制代码
public class AliPay implements PayFactory{

    @Override
    public void orderPay() {
        System.out.println("支付宝支付");
    }
}
java 复制代码
public class AliRefund implements RefundFactory{
    @Override
    public void orderRefund() {
        System.out.println("支付宝退款");
    }
}

微信支付工厂

java 复制代码
/**
 * 微信支付工厂
 */
public class WechatOrderFactory implements OrderFactory{
    @Override
    public PayFactory getPayFactory() {
        return new WechatPay();
    }

    @Override
    public RefundFactory getRefundFactory() {
        return new WechatRefund();
    }
}

支付宝支付工厂

java 复制代码
/**
 * 阿里支付工厂
 */
public class AliOrderFactory implements OrderFactory{
    @Override
    public PayFactory getPayFactory() {
        return new AliPay();
    }

    @Override
    public RefundFactory getRefundFactory() {
        return new AliRefund();
    }
}

工厂生产器

java 复制代码
/**
 * 工厂生产器,传参生产对应的子工厂
 */
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;
    }
}

测试

java 复制代码
public class AppRun {
    public static void main(String[] args) {

        OrderFactory orderFactory = FactoryProducer.getFactory("ALI");
        orderFactory.getPayFactory().orderPay();
        orderFactory.getRefundFactory().orderRefund();

    }
}
java 复制代码
public class AppRun {
    public static void main(String[] args) {

        OrderFactory orderFactory = FactoryProducer.getFactory("WECHAT");
        orderFactory.getPayFactory().orderPay();
        orderFactory.getRefundFactory().orderRefund();

    }
}
相关推荐
架构师沉默2 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群3 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL4 小时前
JVM 类加载:双亲委派机制
java·后端
用户298698530145 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥5 小时前
原来公平锁和非公平锁差别这么大
java
渣哥5 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K5 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty7255 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构
isysc17 小时前
面了一个校招生,竟然说我是老古董
java·后端·面试
幂简集成explinks7 小时前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源