赞
踩
声明:转载请附上原文链接
提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之——单例模式 序号从1开始
⼯⼚模式介绍:
例⼦:
⼯⼚模式有 3 种不同的实现⽅式:
应⽤场景:
createXXX()
⽤来⽣产产品,只需要传⼊你想产品名称下面我们来简单使用一下简单(静态)工厂设计模式:
功能描述:
我们简单使用伪代码模拟一下支付流程:
创建IProduct 抽象产品接口——IPay
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:00
* @Description: IPay抽象统一支付下单接口
*/
public interface IPay {
/**
* 统一下单
*/
void unifiedOrder();
}
创建Product具体产品类——AliPay/WeChatPay
AliPay.java
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:29
* @Description: 支付宝支付具体实现类
*/
public class AliPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("支付宝支付统一下单...");
}
}
WeChatPay.java
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:30
* @Description: 微信支付具体实现类
*/
public class WeChatPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("微信支付统一下单...");
}
}
创建Factory工厂类——SimplePayFactory
/** * @Auther: csp1999 * @Date: 2020/11/07/11:31 * @Description: 简单支付工厂类(静态工厂类) */ public class SimplePayFactory { /** * 工厂创建方法: * 根据参数返回对应的支付对象 * * @param payType * @return */ public static IPay createPay(String payType) { if (payType == null) { return null; } else if (payType.equalsIgnoreCase("WECHAT_PAY")) { return new WeChatPay(); } else if (payType.equalsIgnoreCase("ALI_PAY")) { return new AliPay(); } // 如果需要扩展,可以编写更剁 return null; } }
测试使用简单支付工厂:
@Test
public void testSimplePayFactory(){
IPay wechat_pay = SimplePayFactory.createPay("WECHAT_PAY");
IPay ali_pay = SimplePayFactory.createPay("ALI_PAY");
wechat_pay.unifiedOrder();
ali_pay.unifiedOrder();
}
// 输出结果:
// 微信支付统一下单...
// 支付宝支付统一下单...
上述就是工厂设计模式——简单工程(静态工厂的一个简单使用例子),那么我们来分析下其缺点与不足之处:
需求:
SimplePayFactory
类中添加响应的判断逻辑,比如再加一个if
判断,添加一个A银行支付的逻辑if
判断 添加一个B银行支付的逻辑,依次加下去…下面我们来看一下工厂方法模式是如何解决简单工厂模式的这一缺点
要实现工厂方法模式,只需要在原来的简单工厂模式基础上,做出改进,而之前我们创建的IPay
抽象产品接口和AliPay
WeChatPay
两个具体产品类不需要改动。
首先创建IPayFactory
抽象⼯⼚接口:
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:08
* @Description: 抽象⼯⼚接口
*/
public interface IPayFactory {
IPay getPay();
}
然后创建AliPayFactory
和WeChatFactory
两个具体⼯⼚类:
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:09
* @Description: 具体工厂类 AliPayFactory
*/
public class AliPayFactory implements IPayFactory{
@Override
public IPay getPay() {
return new AliPay();
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:16
* @Description: 具体工厂类 WeChatFactory
*/
public class WeChatFactory implements IPayFactory{
@Override
public IPay getPay() {
return new WeChatPay();
}
}
进行测试:
@Test
public void testMethodPayFactory(){
AliPayFactory aliPayFactory = new AliPayFactory();
IPay ali_pay = aliPayFactory.getPay();
ali_pay.unifiedOrder();// 输出:支付宝支付统一下单...
WeChatFactory weChatFactory = new WeChatFactory();
IPay wechat_pay = weChatFactory.getPay();
wechat_pay.unifiedOrder();// 输出:微信支付统一下单...
}
工厂方法模式思路如下图:
抽象⼯⼚⽅法模式是简单工厂模式 和工厂方法模式的整合升级版。
接下来我们就按照步骤使用一下抽象工厂方法模式:
1、定义两个接⼝ IPay(支付)、IRefund(退款):
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:06
* @Description: 支付抽象接口
*/
public interface IPay {
/**
* 统一下单
*/
void unifiedOrder();
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:07
* @Description: 退款抽象接口
*/
public interface IReFund {
/**
* 退款
*/
void refund();
}
2、创建具体的Pay产品、创建具体的Refund产品:
AliPay/WeChatPay:支付宝支付和微信支付
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:29
* @Description: 支付宝支付具体实现类
*/
public class AliPay implements IPay {
@Override
public void unifiedOrder() {
System.out.println("支付宝支付 统一下单接口...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:30
* @Description: 微信支付具体实现类
*/
public class WeChatPay implements IPay {
@Override
public void unifiedOrder() {
System.out.println("微信支付统一下单...");
}
}
AliRefund/WeChatFund:支付宝退款和微信退款
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:35
* @Description:
*/
public class AliRefund implements IReFund {
@Override
public void refund() {
System.out.println("支付宝退款...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:40
* @Description:
*/
public class WeChatRefund implements IReFund {
@Override
public void refund() {
System.out.println("微信支付退款...");
}
}
3、创建抽象⼯⼚ IOrderFactory 接⼝ ⾥⾯两个⽅法 createPay/createRefund:
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:04
* @Description: 订单抽象工厂,一个超级工厂可以创建其他工厂(又被称为其他工厂的工厂)
*/
public interface IOrderFactory {
IPay createPay();
IReFund createRefund();
}
4、创建⽀付宝产品族AliOderFactory,实现OrderFactory 抽象⼯⼚:
/** * @Auther: csp1999 * @Date: 2020/11/07/16:18 * @Description: */ public class AliOrderFactory implements IOrderFactory { @Override public IPay createPay() { return new AliPay(); } @Override public IReFund createRefund() { return new AliRefund(); } }
5、创建微信⽀付产品族WechatOderFactory,实现 OrderFactory抽象⼯⼚
/** * @Auther: csp1999 * @Date: 2020/11/07/16:39 * @Description: */ public class WeChatOrderFactory implements IOrderFactory { @Override public IPay createPay() { return new WeChatPay(); } @Override public IReFund createRefund() { return new WeChatRefund(); } }
6、定义⼀个超级⼯⼚创造器FactoryProducer,通过传递参数获取对应的⼯⼚
/** * @Auther: csp1999 * @Date: 2020/11/07/16:46 * @Description: 工厂创造器 */ public class FactoryProducer { public static IOrderFactory getFactory(String type){ if (type.equalsIgnoreCase("WECHAT")){ return new WeChatOrderFactory(); }else if (type.equalsIgnoreCase("ALI")){ return new AliOrderFactory(); } return null; } }
最后我们来进行测试:
@Test
public void testAbstractMethodPayFactory(){
IOrderFactory wechatPayFactory = FactoryProducer.getFactory("WECHAT");
wechatPayFactory.createPay().unifiedOrder();
wechatPayFactory.createRefund().refund();
IOrderFactory aliPayFactory = FactoryProducer.getFactory("ALI");
aliPayFactory.createPay().unifiedOrder();
aliPayFactory.createRefund().refund();
}
结果如下:
微信支付统一下单...
微信支付退款...
支付宝支付 统一下单接口...
支付宝退款...
之后我会陆续更新其他设计模式博文,如果文章对您有帮助,希望点个赞/收藏/关注! O(∩_∩)O~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。