简单⼯⼚模式(静态工厂)
核⼼组成
实现步骤
createXXX()
⽤来⽣产产品,只需要传⼊你想产品名称优点:
缺点:
下面我们来简单使用一下简单(静态)工厂设计模式:
功能描述:
我们简单使用伪代码模拟一下支付流程:
创建IProduct 抽象产品接口——IPay
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: IPay抽象统一支付下单接口
*/
public interface IPay {
/**
* 统一下单
*/
void unifiedOrder();
}
创建支付宝支付具体实现类–AliPay
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 支付宝支付具体实现类
*/
public class AliPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("支付宝支付统一下单...");
}
}
创建微信支付具体实现类–WeChatPay
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 微信支付具体实现类
*/
public class WeChatPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("微信支付统一下单...");
}
}
创建一个简单支付工厂类(静态工厂类)–SimplePayFactory
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @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;
}
}
测试使用简单支付工厂:
package com.iswhl.EasyFactory;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @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;
}
}
上述就是工厂设计模式——简单工程(静态工厂的一个简单使用例子),那么我们来分析下其缺点与不足之处:
需求:
SimplePayFactory
类中添加响应的判断逻辑,比如再加一个if
判断,添加一个A银行支付的逻辑if
判断 添加一个B银行支付的逻辑,依次加下去…下面我们来看一下工厂方法模式是如何解决简单工厂模式的这一缺点
⼯⼚⽅法模式
⼜称⼯⼚模式,是对简单⼯⼚模式的进⼀步抽象化,其 好处是可以使系统在不修改原来代码的情况下引进新的 产品,即满⾜开闭原则
通过⼯⼚⽗类定义负责创建产品的公共接⼝,通过⼦类 来确定所需要创建的类型
相⽐简单⼯⼚⽽⾔,此种⽅法具有更多的可扩展性和复⽤性,同时也增强了代码的可读性
将类的实例化(具体产品的创建)延迟到⼯⼚类的⼦类 (具体⼯⼚)中完成,即由⼦类来决定应该实例化哪⼀ 个类
核⼼组成
要实现工厂方法模式,只需要在原来的简单工厂模式基础上,做出改进,而之前我们创建的IPay
抽象产品接口和AliPay
WeChatPay
两个具体产品类不需要改动。
首先创建IPayFactory
抽象⼯⼚接口:
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 抽象⼯⼚接口
*/
public interface IPayFactory {
IPay getPay();
}
然后创建AliPayFactory
和WeChatFactory
两个具体⼯⼚类:
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 具体工厂类 AliPayFactory
*/
public class AliPayFactory implements IPayFactory{
@Override
public IPay getPay() {
return new AliPay();
}
}
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @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();// 输出:微信支付统一下单...
}
工厂方法模式优点:
符合开闭原则,增加⼀个产品类,只需要实现其他具体的产品类和具体的⼯⼚类;
符合单⼀职责原则,每个⼯⼚只负责⽣产对应的产品;
使⽤者只需要知道产品的抽象类,⽆须关⼼其他实现 类,满⾜迪⽶特法则、依赖倒置原则和⾥⽒替换原则;
工厂方法模式缺点:
抽象⼯⼚⽅法模式是简单工厂模式 和工厂方法模式的整合升级版。
⼯⼚模式有 3 种不同的实现⽅式:
简单⼯⼚模式:通过传⼊相关的类型来返回相应的类,这 种⽅式⽐较单 ⼀,可扩展性相对较差;
⼯⼚⽅法模式:通过实现类实现相应的⽅法来决定相应 的返回结果,这种⽅式的可扩展性⽐较强;
抽象⼯⼚模式:基于上述两种模式的拓展,是⼯⼚⽅法 模式的升级版,当需要创建的产品有多个产品线时使⽤ 抽象⼯⼚模式是⽐较好的选择
抽象⼯⼚模式在 Spring 中应⽤得最为⼴泛的⼀种设计模式
背景:
实现步骤:
接下来我们就按照步骤使用一下抽象工厂方法模式:
1、定义两个接⼝ IPay(支付)、IRefund(退款):
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: IPay抽象统一支付下单接口
*/
public interface IPay {
/**
* 统一下单
*/
void unifiedOrder();
}
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 退款抽象接口
*/
public interface IReFund {
/**
* 退款
*/
void refund();
}
2、创建具体的Pay产品、创建具体的Refund产品:
AliPay/WeChatPay:支付宝支付和微信支付
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 具体工厂类 AliPayFactory
*/
public class AliPayFactory implements IPayFactory{
@Override
public IPay getPay() {
return new AliPay();
}
}
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 微信支付具体实现类
*/
public class WeChatPay implements IPay {
@Override
public void unifiedOrder() {
System.out.println("微信支付统一下单...");
}
}
AliRefund/WeChatFund:支付宝退款和微信退款
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description:
*/
public class AliRefund implements IReFund {
@Override
public void refund() {
System.out.println("支付宝退款...");
}
}
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description:
*/
public class WeChatRefund implements IReFund {
@Override
public void refund() {
System.out.println("微信支付退款...");
}
}
3、创建抽象⼯⼚ IOrderFactory 接⼝ ⾥⾯两个⽅法 createPay/createRefund:
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description: 订单抽象工厂,一个超级工厂可以创建其他工厂(又被称为其他工厂的工厂)
*/
public interface IOrderFactory {
IPay createPay();
IReFund createRefund();
}
4、创建⽀付宝产品族AliOderFactory,实现OrderFactory 抽象⼯⼚:
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description:
*/
public class AliOrderFactory implements IOrderFactory {
@Override
public IPay createPay() {
return new AliPay();
}
@Override
public IReFund createRefund() {
return new AliRefund();
}
}
5、创建微信⽀付产品族WechatOderFactory,实现 OrderFactory抽象⼯⼚
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @Description:
*/
public class WeChatOrderFactory implements IOrderFactory {
@Override
public IPay createPay() {
return new WeChatPay();
}
@Override
public IReFund createRefund() {
return new WeChatRefund();
}
}
6、定义⼀个超级⼯⼚创造器FactoryProducer,通过传递参数获取对应的⼯⼚
package com.iswhl.FactoryMethod;
/**
* @Auther: whl
* @Date: 2022/8/08/10:00
* @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;
}
}
最后我们来进行测试:
package com.iswhl.FactoryMethod;
public class test {
public static void main(String[] args) {
IOrderFactory wechatPayFactory = FactoryProducer.getFactory("WECHAT");
wechatPayFactory.createPay().unifiedOrder();
wechatPayFactory.createRefund().refund();
IOrderFactory aliPayFactory = FactoryProducer.getFactory("ALI");
aliPayFactory.createPay().unifiedOrder();
aliPayFactory.createRefund().refund();
}
}
结果如下:
微信支付统一下单...
微信支付退款...
支付宝支付 统一下单接口...
支付宝退款...
⼯⼚⽅法模式和抽象⼯⼚⽅法模式
优点
缺点