以下是我服务层的代码
@Override
public Boolean saveTransportation(SaveTransportationCommand addServiceCommand) {
return getServiceAgreementDao().saveTransportation((List<Transportation>)ServiceAgreementFactory.get(addServiceCommand));
}
我正在尝试从Command object
创建域对象,我可以在Factory中进行验证并从命令设置值,我的方法是否正确,或者我应该只使用Factory来创建对象。
答案 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
}
}
正如之前的帖子所暗示的那样,抽象出验证代码会更清晰。