2015-06-20 23 views
1

我在自由起訴辛格爾頓模式,我在想;什麼時候夠了,夠了?這些都是我現在的單身人士。我並沒有像所有人一樣使用它們。我過度使用Singleton模式嗎?

Database db = Database.getInstance(this); // wrapper for the library 
    Realm realm = Realm.getInstance(this); // library I use 
    AppUtils appUtils = AppUtils.getInstance(this); // app specific functions that manipulate database queries to produce targeted values 
    Utils utils = Utils.getInstance(); 
    Generator gen = Generator.getInstance(this); // necessary for the library 

我想也做這樣的事情

AppFragments fr = AppFragments.getInstance(this, AttributeCommonInEveryActivity>)

或者我應該接口,並做BlerpActivity extends BlourpActivity

最後,以清除可能發生的影響你的意見的任何偏差。我知道,似乎我只使用一種設計模式,但我不是。我在考慮設計和實用方面工作^ _^

+1

如果'Database db'的確是「庫的包裝器」,那麼你不需要'Realm realm',因爲'db'應該包含'Realm'實例,並且如果有的話可以通過'db'獲取它除了'db'需要它。關於你的其他三個單身人士,不知道他們做了什麼,很難告訴你。儘管如此,爲什麼數據需要在全球範圍內成爲具體的具體原因。單身人士因爲「打字很難」不是一個好的理由。 :-) – CommonsWare

+1

似乎你可以使用一個好的[DI](https://en.wikipedia.org/wiki/Dependency_injection)框架,例如[Guice](https://github.com/google/guice/wiki /動機)。這樣,通過簡單地[範圍](https://github.com/google/guice/wiki/Scopes)適當地創建對象,就可以完全避免手寫的JVM單例(一種反模式)。 –

+0

@CommonsWare 您好,非常感謝您的反饋。領域是圖書館,而不是我自己的建築。這就是你與數據庫溝通的方式(叫Realm/lame)。 這是我無法避免的唯一單例。數據庫獲取上下文並創建一個新的RealmInstance來獲取常用結果。 你絕對正確的最後一句話。我儘量使它儘可能模塊化 – MayTheSchwartzBeWithYou

回答

4

是的。是的,你是。但是我甚至在這之前,我認爲你甚至不會使用單身模式

採取像Realm.getInstance(this)這樣的方法,假設thisFooClass。如果Realm是單身人士,則只有一個它的實例永遠存在。如果這是真的,那麼爲什麼你必須通過this如果您通過不同的FooClass,結果會不同嗎?

現在到了實際的問題 - 單身人士的煩惱已經涵蓋了manybefore,所以我不會進入那個。相反,我會告訴你一個替代方法:依賴注入。

這裏的單身您Realm類的版本(?):

class Realm { 
    private static final Realm instance = new Realm(); 

    public static Realm getInstance(FooClass foo) { 
     // black magic with foo 
     return instance; 
    } 
} 

// usage: 
Realm realm = Realm.getInstance(this); 

現在,這裏的DI版本:

你告訴我哪一個看起來更短。

+0

你好。在不知道內部或Realm(https://realm.io/)的情況下,我認爲他們使用類似'Realm.getInsance(context)'的東西來初始化上下文作爲'this.context = context.getApplicationContext()',它是唯一的並堅持不懈。 所以只要你傳遞任何形式的'Context',它總會得到相同的結果。同樣的事情適用於我的其他課程 – MayTheSchwartzBeWithYou