2010-08-17 37 views
1

我正在修改Google Android博客中的Image Downloader。我想ImageDownloader是單身人士,因爲我將在我的應用程序的多個地方使用它。我還希望能夠使用不同的Strategies(例如,生成透明位圖)來操縱Bitmaps如何用策略實現單身人士?

語境:

我希望能夠在一個活動使用ImageDownloader並設置透明位圖,並在另一個使用相同ImageDownloader但使用不同的策略對象中獲取黑&白色的位圖。

回答

3

你認爲你這樣做了,但你不想讓ImageDownloader成爲一個Singleton。辛格爾頓過度使用,並不適合你的情況。想一想:如果只有一個類的實例正在操作,那麼如何使用不同的策略來操作位圖?

您想要的是通過靜態方法創建ImageDownloader實例的能力,您可以在不使其成爲Singleton的情況下進行創建。這些方法被稱爲工廠方法,並且有很多好的網頁描述它們。

你可能想是這樣的:

class ImageDownloader { 
    static ImageDownloader createImageDownloader(Strategy s) {...} 
    //... 
} 

每次調用該方法使用相同的參數可以返回ImageDownloader的同一個實例,提供的實例不存儲狀態。這種方法的一些版本被稱爲「Multiton」。谷歌會告訴你更多。

+1

雖然我同意,他不* *其實想一個Singleton,依賴注入和需要ImageDownloader的類的工廠的組合會比靜態工廠更好。 – kyoryu 2010-08-17 16:46:17

+0

這可能是對的。我決定保持簡單。隨意寫一個更復雜的答案。 – DJClayworth 2010-08-17 16:48:15

+0

是的 - 實例不存儲狀態。我已經在構造函數中通過策略結束了,但將其轉換爲靜態工廠將符合我的目的。 – pixel 2010-08-17 20:22:03

0

您可以將策略作爲參數傳遞給負責圖像下載/操作的方法。

然後通過的策略將處理操作。雖然這是一個相當醜陋的黑客攻擊。查看DJClayworth對更乾淨的代碼想法的回答。

1

我更傾向於用DJClayworth答案認同,但要回答你的問題,實現單件模式的最佳方法是使用一個枚舉:

public enum ImageDownloaderWrapper 
{ 
    INSTANCE; 

    public static final ImageDownloader IMAGE_DOWNLOADER; 

    private ImageDownloaderWrapper() 
    { 
     IMAGE_DOWNLOADER = new ImageDownloader();//this is where you would initialize it... looks like it has a default constructor 
    } 
} 

來獲得實例的保持:

ImageDownloaderWrapper.INSTANCE.IMAGE_DOWNLOADER.download(... 

您還可以利用靜態導入的優勢:

import static some.package.structure.ImageDownloaderWrapper.INSTANCE; 

然後,它的簡單一點:

INSTANCE.IMAGE_DOWNLOADER.download(... 

爲了考慮不同的策略,我想你不得不延長ImageDownloader並添加適當的邏輯與策略,在該子類交易(IMAGE_DOWNLOADER的類型也應符合您所創建的子類)。