设计模式-抽象工厂模式

核心思想

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


优缺点

优点

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

缺点

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

代码示例

支付抽象类

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

    }
}
相关推荐
weixin_440784111 小时前
【HandlerThread实现原理】
android·java·开发语言
leoZ2312 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
mubei-1233 小时前
SpringDAO的用法
java·开发语言·数据库
happymagic3 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
都叫我大帅哥6 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行6 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_123457 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
董员外7 小时前
RAG 系统进化论(八):Agentic RAG(智能体式 RAG),从回答问题到完成任务
人工智能·后端·设计模式
码智社8 小时前
JSON 零基础到资深全体系教程
java·json
wgego9 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记