⼜称静态⼯⼚⽅法,可以根据参数的不同返回不同类的实例,专⻔定义⼀个类来负责创建其他类的实例,被创建的实例通常都具有共同的⽗类。由于⼯⼚⽅法是静态⽅法,可通过类名直接调⽤,⽽且只需要传⼊简单的参数即可。
核⼼组成:
实现步骤:
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();// 输出:微信支付统一下单...
}
工厂方法模式思路如下图:
工厂方法模式优点:
工厂方法模式缺点:
抽象⼯⼚⽅法模式是简单工厂模式 和工厂方法模式的整合升级版。象⼯⼚模式在 Spring 中应⽤得最为⼴泛的⼀种设计模式。
背景:
实现步骤:
IPay
(支付)、IRefund
(退款)。Pay
产品、创建具体的 Refund
产品。IOrderFactory
接⼝ ⾥⾯两个⽅法 createPay/createRefund。
AliOderFactory
,实现 OrderFactory
抽象⼯⼚。WechatOderFactory
,实现 OrderFactory
抽象⼯⼚。FactoryProducer
,通过传递参数获取对应的⼯⼚。接下来我们就按照步骤使用一下抽象工厂方法模式:
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();
}
结果如下:
微信支付统一下单...
微信支付退款...
支付宝支付 统一下单接口...
支付宝退款...
⼯⼚⽅法模式和抽象⼯⼚⽅法模式
总结的面试题也挺费时间的,文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请三连支持一下,后续会亿点点的更新!
为了帮助更多小白从零进阶 Java 工程师,从CSDN官方那边搞来了一套 《Java 工程师学习成长知识图谱》,尺寸 870mm x 560mm
,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下,当然,不管怎样博主的文章一直都是免费的~