这是工厂模式的第三篇没有看前两篇的建议看完之前写的两篇,再看这篇文章,这样子会让你更能理解工厂模式的抽象工厂,抽象工厂使用一个产品族拥有多款产品类型,不同的产品族又构成等级关系。
抽象工厂的优缺点:
/**
* 工厂方法模式和抽象工厂方法模式之间的转换关系:
* 当抽象模式每一个具体工厂类只能创建一个产品对象的时候,抽象的工厂模式就会退化到工厂方法模式
* 抽象工厂方法模式优点:
* 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();
}
}