【问题标题】:Factory Pattern when Constructor of the Implementation has Dependencies to Inject当实现的构造函数具有要注入的依赖项时的工厂模式
【发布时间】:2017-07-21 20:18:41
【问题描述】:

我正在处理私人事务,我遇到了需要其他意见的问题。我有以下代码,我想在其中创建一个工厂模式来创建 PaymentStrategy 的新实例:

PaymentStrategy接口

public interface PaymentStrategy {

  Optional<Payment> pay(String payerAccountNumber,
                        String sellerAccountNumber,
                        ProductOrder[] productOrder
  );
}

EmployeePaymentStrategyimplementation 有两个依赖项

public class EmployeePaymentStrategy implements PaymentStrategy {

  private final ProfileRemoteProvider profileRemoteProvider;
  private final PaymentValidator      paymentValidator;

  @Autowired
  public EmployeePaymentStrategy(ProfileRemoteProvider profileRemoteProvider,
                                 PaymentValidator paymentValidator) {
    this.profileRemoteProvider = profileRemoteProvider;
    this.paymentValidator = paymentValidator;
  }

  @Override
  public Optional<Payment> pay(String payerAccountNumber,
                               String sellerAccountNumber,
                               ProductOrder[] productOrder) {
    ...
  }
}

我想知道如何处理 Factory 类中的依赖关系。 EmployeePaymentStrategy 类是注入这两个依赖项的正确位置吗? 工厂模式是解决问题的最好方法吗

PaymentStrategyFactory 哪里有问题

public class PaymentStrategyFactory {

  private PaymentStrategyFactory() {
  }

  public static PaymentStrategy getPaymentStrategy(AccountType payerAccountType,
                                                   AccountType sellerAccountType) {
    if (sellerAccountType == AccountType.COMPANY) {
      switch (payerAccountType) {
        case EMPLOYEE:
          return new EmployeePaymentStrategy(...); //TODO 
        case BASIC_USER:
          return ...
        default:
          //this exception is throw when a payer account type is unknown
          throw new RuntimeException("exception type will be more specific");
      }
    }
    //This exception is throw when a seller account type is not a seller
    throw new RuntimeException("exception type will be more specific");
  }
}

【问题讨论】:

  • 你不应该使用new EmployeePaymentStrategywhich,而是调用你的DI框架来实例化EmployeePaymentStrategywhich bean的实例
  • 感谢您的建议。我用你的提议更新了我的帖子。现在这段代码线程安全吗?

标签: java spring dependency-injection autowired factory-pattern


【解决方案1】:

PaymentStrategyFactory 已更新并正在运行

public class PaymentStrategyFactory {

  private static ApplicationContext context;
  private ApplicationContext applicationContext;

  @Autowired
  private PaymentStrategyFactory(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
  }

  @PostConstruct
  private void initializeApplicationContext() {
    PaymentStrategyFactory.context = applicationContext;
    this.applicationContext = null;
  }

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    PaymentStrategyFactory.context = context;
  }

  public static PaymentStrategy getPaymentStrategy(AccountType payerAccountType,
                                                   AccountType sellerAccountType) {
    if (sellerAccountType == AccountType.COMPANY) {
      switch (payerAccountType) {
        case EMPLOYEE:
          return context.getBean(EmployeePaymentStrategy.class);
          // return new EmployeePaymentStrategy();
        case BASIC_USER:
           ...
        }
     } 
     throw ...
   }
}

除了下面 Ilya 的评论,this post 帮助我在使用 Spring 进行 DI(依赖注入)时处理静态成员。现在对我来说一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2016-04-28
    相关资源
    最近更新 更多