簡體   English   中英

創建用於創建域對象的工廠的正確方法

[英]The correct way of creating a Factory for creating domain objects

以下是我的服務層中的代碼

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

我正在嘗試從Command object創建域Command object ,可以在Factory中通過Command object進行驗證並設置值,這是我的方法正確嗎,還是應該將Factory僅用於創建對象?

工廠用於創建對象。 我認為,在創建對象之前在工廠方法內進行驗證和設置值並不構成犯罪。 如果您太擔心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
      }
  }
}

首先,假設您要從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
    }
}

正如先前的文章所建議的那樣,抽象出驗證代碼會更清潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM