设计模式—创建型工厂模式之抽象工厂JAVA实现(工厂模式完结)

这是工厂模式的第三篇没有看前两篇的建议看完之前写的两篇,再看这篇文章,这样子会让你更能理解工厂模式的抽象工厂,抽象工厂使用一个产品族拥有多款产品类型,不同的产品族又构成等级关系。

抽象工厂的优缺点:


        /**
         * 工厂方法模式和抽象工厂方法模式之间的转换关系:
         * 当抽象模式每一个具体工厂类只能创建一个产品对象的时候,抽象的工厂模式就会退化到工厂方法模式
         * 抽象工厂方法模式优点:
         * 1.产品族中有多个对象被设计成一起工作时,它能保证使用方只使用同一个产品中的对象
         * 缺点:
         * 1.产品族扩展困难,要增加一个系列的某一个产品,既要在抽象工厂和抽象产品里修改代码,
         * 又要在具体的里面加产品加代码,不是很符合开闭原则
         * 2.增加系统的抽象性和理解难度
         */

简单工厂模式文章链接:设计模式—创建型工厂模式之简单工厂JAVA实现_chenxiky的博客-CSDN博客

工厂方法模式文章链接:设计模式—创建型工厂模式之工厂方法JAVA实现_chenxiky的博客-CSDN博客

我举一个汽车简单的例子来理解抽象工厂:

奔驰:轿车 越野 SUV (一个产品族)

宝马:轿车 越野 SUV (一个产品族)

等级 等级 等级(相同)

代码目录结构图:

 通过以上的目录结构我们就很清楚的看到抽象工厂实现支付宝支付退款,微信支付退款的复杂性

首先我们要先编写支付,退款的公共类(面向接口编程):

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/14:09
 * @Description: 支付抽象接口
 */
public interface  IPay   {

    /**
     * 统一下单
     */
    void unifiedorder();
}
package top.chenxiky.factory.abstracted;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/15:58
 * @Description: 退款抽象的接口
 */
public interface IRefund {
    /**
     * 统一退款
     */
    void refund();
}

编写订单抽象工厂类:

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/15:56
 * @Description: 订单抽象工厂 : 含有支付 退款抽象
 */
public interface OrderFactory {
    /**
     * 支付的工厂
     * @return
     */
    IPay createPay();

    /**
     * 退款的工厂
     * @return
     */
    IRefund createRefund();
}

再进行ali包的编写,实现支付宝支付和退款的两个实现类:

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/14:08
 * @Description: 支付宝支付实现类
 */
public class AliIPay implements IPay {
    @Override
    public void unifiedorder() {
        //TODO 支付宝支付的业务逻辑
        System.out.println("支付宝支付,统一下单。");
    }
}
package top.chenxiky.factory.abstracted.ali;


import top.chenxiky.factory.abstracted.IRefund;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/16:03
 * @Description: 支付宝退款成功实现类
 */
public class AliIRefund implements IRefund {
    @Override
    public void refund() {
        //TODO 支付宝退款的业务逻辑
        System.out.println("支付宝退款成功");
    }
}

 编写支付工厂:

package top.chenxiky.factory.abstracted.ali;

import top.chenxiky.factory.abstracted.OrderFactory;
import top.chenxiky.factory.abstracted.IPay;
import top.chenxiky.factory.abstracted.IRefund;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/16:01
 * @Description: 支付宝的工厂: 有支付,退款功能
 */
public class AliOrderFactory implements OrderFactory {
    @Override
    public IPay createPay() {
        return new AliIPay();
    }

    @Override
    public IRefund createRefund() {
        return new AliIRefund();
    }
}

wechat包也同上的方式我在这里就不写出来了。

构建一个超级工厂创造器:
/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/16:20
 * @Description: 超级工厂创造器,简单工厂模式
 */
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;
    }
}

通过超级工程创造器的代码,我们似乎又回到了之前的简单工程模式,通过类型来获取相应的支付功能。 

测试主程序代码:

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenxiky
 * @Date: 2022/03/20/16:24
 * @Description:
 */
public class Main {
    public static void main(String[] args) {

        // 调用支付宝模块
        OrderFactory ali = FactoryProducer.getFactory("ALI");
        ali.createPay().unifiedorder();
        ali.createRefund().refund();

        // 微信模块
        OrderFactory wechat = FactoryProducer.getFactory("WECHAT");
        wechat.createPay().unifiedorder();
        wechat.createRefund().refund();       

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值