我正在處理一組消息對象,每個消息對象都有一個對應於它們的唯一標識符。每條消息都可以從Map或ByteBuffer構造(消息是二進制的,但我們知道如何傳入和傳出二進制表示)。Java - 靜態工廠方法和開關語句
當前實現構建這些消息大致如下:現在
public static Message fromMap(int uuid, Map<String, Object> fields) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(fields);
.
.
.
default:
// Error
return null;
}
}
public static Message fromByteBuffer(int uuid, ByteBuffer buffer) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(buffer);
.
.
.
default:
// Error
return null;
}
}
,約1項Josh Bloch's Effective Java會談:考慮靜態工廠方法而不是構造器,這似乎是一個地方,這種模式是有用(客戶端不直接訪問消息子類型的構造函數;而是通過這種方法)。但我不喜歡這樣的事實,即我們必須記住更新兩個開關語句(違反DRY原則)。
我會很感激任何洞察到最好的方式來實現這一點;我們並沒有緩存對象(每次調用fromMap或fromByteBuffer都會返回一個新對象),這會否定使用這種靜態工廠方法的一些好處。關於這段代碼的一些東西讓我覺得不對,所以我很想聽到社區關於這是否構建新對象的有效方法的想法,或者如果不是更好的解決方案。
如果工廠對象存儲在地圖中並由uuid檢索,則不需要開關。 – rsp 2010-01-11 19:48:15
是的,這就是我說的:-)我甚至添加了一個鏈接到你的答案:) – Fortega 2010-01-12 09:18:13
這是一個很好的解決方案(所以+1),但如果目標是擺脫雙開關,你可能只是因素將開關邏輯切換到單獨的方法。 (該地圖基本上是一個變相的開關) – wds 2010-01-16 00:05:08