设计模式-抽象工厂模式

核心思想

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


优缺点

优点

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

缺点

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

代码示例

支付抽象类

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

    }
}
相关推荐
杀死那个蝈坦19 分钟前
Caffeine
java·jvm·spring cloud·tomcat
n***271921 分钟前
JAVA (Springboot) i18n国际化语言配置
java·spring boot·python
汤姆yu22 分钟前
基于springboot的校园家教信息系统
java·spring boot·后端·校园家教
q***062924 分钟前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
urkay-26 分钟前
Android 切换应用语言
android·java·kotlin·iphone·androidx
小石头 1008632 分钟前
【Java】String类(超级详细!!!)
java·开发语言·算法
.柒宇.37 分钟前
力扣hot100---42.接雨水(java版)
java·算法·leetcode
D***441438 分钟前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
java·spring boot·后端
迈巴赫车主44 分钟前
蓝桥杯20534爆破 java
java·数据结构·算法·职场和发展·蓝桥杯
汝生淮南吾在北1 小时前
SpringBoot+Vue在线笔记管理系统
java·vue.js·spring boot·笔记·毕业设计·毕设