设计模式
Spring用到的主要设计模式
- 工厂
- 代理
- 模板
简单工厂设计模式
概念:通过工厂类来创建对象。
好处:解耦合。
什么是耦合:代码间的强关联关系,一方改变会影响到另一方。
问题:不利于代码维护。
问题原因:把接口的实现类,硬编码在程序中。

这样的话之后想要换Impl就需要改代码。
如何解耦合?
通过创建一个工厂类,从工厂类中调用方法来获取Impl.
public class BeanFactory {
public static UserService getUserServiceImpl () {
return new UserServiceImpl();
}
}
那么可以在具体使用处用 UserService userService = BeanFactory.getUserService();代替。
或者用反射通过包名获取类。
UserService userService = null;
try {
Class clazz = Class.forName("com.example.basic.UserServiceImpl")
userService = (UserService) clazz.newInstance();
} catch (ClassNotFoundExecption e) {
e.printStackTrace();
}
return userService;
反射会发生异常,所以要try/catch。这样还是不能完全解耦合。因为要写包名。
那么可以在配置文件中配置。在resource文件夹中添加配置文件。

构建器模式(Builder Pattern)
使用构建器模式(Builder Pattern)来创建对象是一种常见的设计模式,特别是在需要创建具有多个可选参数或复杂构造逻辑的对象时。UserPayResultQueryRequest 类可能使用了这种模式来提供更灵活和易读的构造方式。下面是一些使用构建器模式的原因:
-
可读性和简洁性:
- 使用构建器模式可以避免在构造函数中传递大量参数,使代码更加清晰和易于阅读。
- 例如,直接使用构造函数可能会导致长参数列表,而使用构建器模式则可以逐步设置每个参数。
-
灵活性:
- 构建器模式允许你选择性地设置对象的属性,而不是必须在构造函数中指定所有属性。
- 这对于具有许多可选参数的对象特别有用,因为你可以只设置你需要的那些参数。
-
不可变对象:
- 构建器模式通常用于创建不可变对象。一旦对象被创建,其状态就不能再改变。
- 不可变对象在多线程环境中非常有用,因为它们是线程安全的。
-
链式调用:
- 构建器模式支持链式调用,使得代码更加简洁和优雅。
- 例如:
UserPayResultQueryRequest.builder().param1(value1).param2(value2).build();
-
默认值处理:
- 构建器模式可以方便地为未设置的参数提供默认值,从而简化对象的创建过程。
示例
假设 UserPayResultQueryRequest 类有以下属性:
userIdtransactionIdamountcurrency
使用构建器模式创建对象的示例代码如下:
UserPayResultQueryRequest request = UserPayResultQueryRequest.builder()
.userId("12345")
.transactionId("TX123456789")
.amount(100.0)
.currency("USD")
.build();
实现细节
UserPayResultQueryRequest 类可能看起来像这样:
public class UserPayResultQueryRequest {
private String userId;
private String transactionId;
private double amount;
private String currency;
// 私有构造函数
private UserPayResultQueryRequest(Builder builder) {
this.userId = builder.userId;
this.transactionId = builder.transactionId;
this.amount = builder.amount;
this.currency = builder.currency;
}
// 获取器方法
public String getUserId() {
return userId;
}
public String getTransactionId() {
return transactionId;
}
public double getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
// 静态内部类 Builder
public static class Builder {
private String userId;
private String transactionId;
private double amount;
private String currency;
public Builder() {}
public Builder userId(String userId) {
this.userId = userId;
return this;
}
public Builder transactionId(String transactionId) {
this.transactionId = transactionId;
return this;
}
public Builder amount(double amount) {
this.amount = amount;
return this;
}
public Builder currency(String currency) {
this.currency = currency;
return this;
}
public UserPayResultQueryRequest build() {
return new UserPayResultQueryRequest(this);
}
}
// 静态工厂方法
public static Builder builder() {
return new Builder();
}
}
通过这种方式,你可以更灵活、更清晰地创建 UserPayResultQueryRequest 对象,并且可以选择性地设置所需的属性。
可以用lombok中的Builder注释深略上面的代码。
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
public class UserPayResultQueryRequest extends BaseRequest {
private String userId;
private String transactionId;
private double amount;
private String currency;
}