2017-04-09 128 views
1

以下是从我的业务层创建域创建一个工厂的正确方式对象

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

我试图从Command object创建域对象的代码,我可以做验证和设定值从命令工厂,是我的方法正确,或者我应该使用Factory来创建对象。

+0

你能格式化你的代码吗? – prasanth

+0

完成格式化代码 – Rajan

回答

1

工厂用于创建对象。在我看来,在创建对象之前在工厂方法中进行验证和设置值并不是犯罪。如果你太担心工厂做这种事情(如果你想让你的工厂松散耦合),你可以有一个接口并将它作为参数传递给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 
     } 
    } 
} 
+0

感谢您的回复 – Rajan

+0

不客气。考虑在堆栈溢出问题/答案upvoting,以便其他用户会知道它是有帮助的:) – prasanth

+0

我最初的想法是,工厂将做对象的创建,我想建立域对象关注分离,建设工厂将不会受到伤害。 – Rajan

1

首先,我假设你正在创建从ServiceAgreementFactoryTransportation列表?如果是这样,调用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 
    } 
} 

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