设计模式-抽象工厂模式

核心思想

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


优缺点

优点

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

缺点

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

代码示例

支付抽象类

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();

    }
}
相关推荐
大圣编程1 小时前
Java 多维数组详解
java·开发语言
万法若空3 小时前
【算法-查找】查找算法
java·数据结构·算法
researcher-Jiang5 小时前
Design Patterns——Template Method入门到情景实战
python·设计模式·模板方法模式
HZZD_HZZD5 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
山登绝顶我为峰 3(^v^)38 小时前
C/C++ 交叉编译方法
java·c语言·c++
一叶飘零_sweeeet8 小时前
Codex 与 Claude Code 深度拆解:两代 AI 编程智能体的技术本质与 Java 实战指南
java·ai·codex·claude code
Listen·Rain9 小时前
提示词和提示词模板
java·人工智能·spring boot
wuqingshun3141599 小时前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
我今晚不熬夜9 小时前
Java语言实现Modbus协议通过用串口读取数据(以RTU为例)
java·网络协议