创建域创建一个工厂的正确方式对象
问题描述:
以下是从我的业务层创建域创建一个工厂的正确方式对象
@Override
public Boolean saveTransportation(SaveTransportationCommand addServiceCommand) {
return getServiceAgreementDao().saveTransportation((List<Transportation>)ServiceAgreementFactory.get(addServiceCommand));
}
我试图从Command object
创建域对象的代码,我可以做验证和设定值从命令工厂,是我的方法正确,或者我应该使用Factory来创建对象。
答
工厂用于创建对象。在我看来,在创建对象之前在工厂方法中进行验证和设置值并不是犯罪。如果你太担心工厂做这种事情(如果你想让你的工厂松散耦合),你可以有一个接口并将它作为参数传递给Factory。内部获取方法,你首先验证。如果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
}
}
}
答
首先,我假设你正在创建从ServiceAgreementFactory
的Transportation
列表?如果是这样,调用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
}
}
正如之前的文章所暗示的那样,抽象出验证代码会更清晰。
你能格式化你的代码吗? – prasanth
完成格式化代码 – Rajan