2017-04-09 135 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 
    } 
} 

正如之前的文章所暗示的那樣,抽象出驗證代碼會更清晰。