Administrator
发布于 2025-12-12 / 7 阅读
0

Spring主要设计模式

设计模式

b站视频教程

Spring用到的主要设计模式

  1. 工厂
  2. 代理
  3. 模板

简单工厂设计模式

概念:通过工厂类来创建对象。

好处:解耦合。

什么是耦合:代码间的强关联关系,一方改变会影响到另一方。

问题:不利于代码维护。

问题原因:把接口的实现类,硬编码在程序中。

693badbd36552.png

这样的话之后想要换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文件夹中添加配置文件。

693f78462f12a.png

构建器模式(Builder Pattern)

使用构建器模式(Builder Pattern)来创建对象是一种常见的设计模式,特别是在需要创建具有多个可选参数或复杂构造逻辑的对象时。UserPayResultQueryRequest 类可能使用了这种模式来提供更灵活和易读的构造方式。下面是一些使用构建器模式的原因:

  1. 可读性和简洁性

    • 使用构建器模式可以避免在构造函数中传递大量参数,使代码更加清晰和易于阅读。
    • 例如,直接使用构造函数可能会导致长参数列表,而使用构建器模式则可以逐步设置每个参数。
  2. 灵活性

    • 构建器模式允许你选择性地设置对象的属性,而不是必须在构造函数中指定所有属性。
    • 这对于具有许多可选参数的对象特别有用,因为你可以只设置你需要的那些参数。
  3. 不可变对象

    • 构建器模式通常用于创建不可变对象。一旦对象被创建,其状态就不能再改变。
    • 不可变对象在多线程环境中非常有用,因为它们是线程安全的。
  4. 链式调用

    • 构建器模式支持链式调用,使得代码更加简洁和优雅。
    • 例如:UserPayResultQueryRequest.builder().param1(value1).param2(value2).build();
  5. 默认值处理

    • 构建器模式可以方便地为未设置的参数提供默认值,从而简化对象的创建过程。

示例

假设 UserPayResultQueryRequest 类有以下属性:

  • userId
  • transactionId
  • amount
  • currency

使用构建器模式创建对象的示例代码如下:

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;
}