设计模式-抽象工厂模式

核心思想

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


优缺点

优点

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

缺点

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

代码示例

支付抽象类

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

    }
}
相关推荐
疯狂成瘾者42 分钟前
LangChain4j ApacheTikaDocumentParser:多格式文档接入的统一入
java·langchain4j
庞轩px2 小时前
第三篇:泛型深度解析——类型擦除与通配符的奥秘
java·编译·泛型·类型擦除
HoneyMoose9 小时前
Jenkins Cloudflare 部署提示错误
java·servlet·jenkins
阿丰资源9 小时前
基于SpringBoot的物流信息管理系统设计与实现(附资料)
java·spring boot·后端
Predestination王瀞潞9 小时前
Java EE3-我独自整合(第四章:Spring bean标签的常见配置)
java·spring·java-ee
overmind9 小时前
oeasy Python 121[专业选修]列表_多维列表运算_列表相加_列表相乘
java·windows·python
资深数据库专家9 小时前
总账EBS 应用服务器1 的监控分析
java·网络·数据库
房开民9 小时前
可变参数模板
java·开发语言·算法
t***54410 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
_深海凉_10 小时前
LeetCode热题100-最小栈
java·数据结构·leetcode