2010-09-30 96 views
4

最近我想出了動態創建對象的簡單模式的想法。我真的很喜歡它。
我相信那個「輪子」是被髮明和命名的。有人可以指出一些GOF模式嗎?動態對象創建模式 - 我愛

問題:我不想在開始時初始化大量對象。全部都是一個類的實例。 ({「str1」,obj1},{「str2」, OBJ 2},...) 當請求帶有STR1我需要返回OBJ1,...
我能有(僞)

if(str == str1) 
    return new Obj(obj1_init_params); 
else if(str == str2) 
    return new Obj(obj2_init_params); 

...

不過是這樣的:

  1. 低效 - 在條件滿足的情況下完成。
  2. 醜陋:)

爲了解決1.你可以使用地圖:

map.put(str1, new Obj(obj1_init_params)) 
map.put(str2, new Obj(obj2_init_params)) 

則:

map.get(str1) 

這是快速的解決方案,但所有一次不是按需創建。所以....

創建一個包裝接口:

IWrapper { 
    Obj getObj(); 
} 

然後,我把它放在地圖:

map.put("str1", new IWrapper(){Obj getObj() {return new Object(object1_params)}; 

現在我在家裏:

  1. 快速:地圖獲得( 「STR1」)getObj();
  2. Dynamic - getObj()< - 創建對象被推遲。

這是如此簡單,很好,有人之前命名它。 我是java程序員,所以在這裏工作很好。你能帶來類似的優雅解決方案嗎?

+3

我投票,因爲找工作的優化代碼屬於在代碼審查,關閉這一問題作爲題外話,不堆棧溢出。 – TylerH 2017-03-01 20:13:40

+0

@TylerH是什麼讓你回顧這6年以上。老問題?只是好奇 – OscarRyz 2017-03-01 23:08:04

+1

@OscarRyz http://meta.stackoverflow.com/questions/341843/should-we-burninate-software-engineering過去〜40天裏,在這個問題中使用的標籤上正在進行一次刻錄工作。我們用它來回顧問題,並確定它們在標記本身之前是否在話題上。 – TylerH 2017-03-02 15:51:47

回答

4

編輯我把「what」和「how」混合在一起。

你實現什麼? A lazy initialization如何你是否已經實現了它?通過Factory pattern(許多人已經寫過)。

UPDATE您可以使用標準Callable接口而不是IWrapper

map.put(str, new Callable<Obj>() { Obj call() { return new Obj(str); } }); 
+4

一個懶惰的工廠:) – 2010-09-30 07:45:03

+0

非常好的解釋,通常我知道工廠,懶惰的評價(這嚇壞了我一如既往,我的第一個想法是辛格爾頓模式 - 我開始討厭)。但我無法將我的概念融入其中,因爲它是兩者的組合。簡單的「什麼」和「怎麼樣」的觀點讓所有人都清楚!非常感謝! – Gadolin 2010-09-30 09:16:57

+0

@Gadolin我添加了一個關於'Callable'接口的說明。 – Bolo 2010-10-07 08:49:17

1

這是一個工廠模式:http://en.wikipedia.org/wiki/Factory_pattern

工廠模式是軟件開發用於封裝參與創建的對象的處理的造物設計模式。 創建對象通常需要複雜的過程,不適合包含在組合對象中。

對象的創建可能會導致代碼的重複,可能需要組成對象無法訪問的信息,可能無法提供足夠的抽象級別,或者可能不會成爲組成對象關注的一部分。

一些在創建的對象的所需的過程的包括確定哪個對象創建,管理對象的生存期,和管理對象的專門積聚和拆除的擔憂。

1

至於其他以前說過,這被稱爲「Factory pattern」。做好自己的想法。

如果你想借此一步,創建一個地圖,只包含類名(一個字符串)。這使您可以從文件中讀取名稱,最後以「Inversion of Control」結尾,導致「Dependency Injection」。