目录
- 项目结构
- 完整代码
- 测试
- 参考视频
本文实现功能:使用spring中的工厂模式:ServiceLocatorFactoryBean实现多方支付功能。
项目结构
$ tree
.
├── pom.xml
└── src└── main└── java└── com└── example└── demo├── Application.java├── config│ └── PaymentConfig.java├── controller│ └── PaymentController.java├── factory│ └── PaymentFactory.java└── service├── Payment.java└── impl├── AliPayment.java└── WechatPayment.java
完整代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
Application.java
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 项目启动类*/
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
Payment.java
package com.example.demo.service;/*** 统一的支付接口*/
public interface Payment {void pay(double amount);
}
WechatPayment.java
package com.example.demo.service.impl;import com.example.demo.service.Payment;/*** 微信支付 实现类*/
public class WechatPayment implements Payment {@Overridepublic void pay(double amount) {System.out.println("微信支付: " + amount);}
}
AliPayment.java
package com.example.demo.service.impl;import com.example.demo.service.Payment;/*** 支付宝支付 实现类*/
public class AliPayment implements Payment {@Overridepublic void pay(double amount) {System.out.println("支付宝支付: " + amount);}
}
PaymentFactory.java
package com.example.demo.factory;import com.example.demo.service.Payment;/*** 支付工厂的接口*/
public interface PaymentFactory {/*** 根据类型获取支付实例* @param type* @return*/Payment getPayment(String type);
}
PaymentConfig.java
package com.example.demo.config;import com.example.demo.factory.PaymentFactory;
import com.example.demo.service.impl.AliPayment;
import com.example.demo.service.impl.WechatPayment;
import org.springframework.beans.factory.config.ServiceLocatorFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;/*** 支付配置类*/
@Configuration
public class PaymentConfig {/*** 创建动态代理对象,实现支付工厂接口** @return*/@Beanpublic ServiceLocatorFactoryBean serviceLocatorFactoryBean() {ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();// 设置要代理的接口factoryBean.setServiceLocatorInterface(PaymentFactory.class);return factoryBean;}/*** 定义原型作用域的bean** @return*/@Bean(name = "wechat")@Scope("prototype")public WechatPayment wechatPayment() {return new WechatPayment();}@Bean(name = "ali")@Scope("prototype")public AliPayment aliPayment() {return new AliPayment();}
}
PaymentController.java
package com.example.demo.controller;import com.example.demo.factory.PaymentFactory;
import com.example.demo.service.Payment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PaymentController {/*** 支付工厂接口*/@Autowiredprivate PaymentFactory paymentFactory;/*** 支付接口* @param type 支付类型* @return*/@GetMapping("/pay")public String pay(@RequestParam String type) {// 获取支付实例Payment payment = paymentFactory.getPayment(type);double amount = 100.00;payment.pay(amount);return "支付完成";}
}
测试
http://127.0.0.1:8080/pay?type=alihttp://127.0.0.1:8080/pay?type=wechat
参考视频
- 工厂模式之ServiceLocatorFactoryBean