[英]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.