创建工厂以创建域对象的正确方法

时间:2017-04-09 04:57:43

标签: java design-patterns factory-pattern

以下是我服务层的代码

@Override
    public Boolean saveTransportation(SaveTransportationCommand addServiceCommand)  {
        return getServiceAgreementDao().saveTransportation((List<Transportation>)ServiceAgreementFactory.get(addServiceCommand));
}

我正在尝试从Command object创建域对象,我可以在Factory中进行验证并从命令设置值,我的方法是否正确,或者我应该只使用Factory来创建对象。

2 个答案:

答案 0 :(得分:1)

Factory用于创建对象。在我看来,在创建对象之前进行验证并在工厂方法中设置值并不构成犯罪。如果你太担心工厂做这些事情(如果你想让你的工厂松散耦合),你可以有一个Validator接口并将它作为参数传递给Factory。在get方法中,首先验证。如果validate返回true,则实例化该对象,否则抛出Exception。

public interface Validator {
   boolean validate(SaveTransportationCommand command);
}

修改ServiceAgreementFactory.get()以接收Validator

public class ServiceAgreementFactory {

  List<Transportation> get(SaveTransportationCommand command, Validator validator) {
      if(!validator.validate(command)) {
        // throw Exception
      }
  }
}

答案 1 :(得分:1)

首先,我假设您要从Transportation创建ServiceAgreementFactory列表?如果是这样,调用get()方法的位置并不重要。通常,工厂有一个实例化一个实例的方法,实例化一个列表的方法只是该方法的一个循环。

对工厂使用静态方法没有任何问题。就个人而言,我更喜欢为工厂声明一个接口并提供默认实现。这样,使用工厂的代码只耦合到接口而不是实现。

一个例子如下。

public interface ServiceAgreementFactory {
    Transportation get(SaveTransportationCommand command);
    default List<Transportation> getList(SaveTransportationCommand command) {
        // loop to call get(SaveTransportationCommand)
    }
}

public class DefaultServiceAgreementFactory implements ServiceAgreementFactory {
    Transportation get(SaveTransportationCommand command) {
        // instantiating code
    }
}

至于验证,您可以在工厂中进行验证。示例如下。

public class DefaultServiceAgreementFactory implements ServiceAgreementFactory {
    Transportation get(SaveTransportationCommand command) {
        // validation code
        if (validation fails) {
            // throw exception
        }
        // instantiating code
    }
}

正如之前的帖子所暗示的那样,抽象出验证代码会更清晰。