我正在修改Google Android博客中的Image Downloader。我想ImageDownloader
是單身人士,因爲我將在我的應用程序的多個地方使用它。我還希望能夠使用不同的Strategies
(例如,生成透明位圖)來操縱Bitmaps
。如何用策略實現單身人士?
語境:
我希望能夠在一個活動使用ImageDownloader
並設置透明位圖,並在另一個使用相同ImageDownloader
但使用不同的策略對象中獲取黑&白色的位圖。
我正在修改Google Android博客中的Image Downloader。我想ImageDownloader
是單身人士,因爲我將在我的應用程序的多個地方使用它。我還希望能夠使用不同的Strategies
(例如,生成透明位圖)來操縱Bitmaps
。如何用策略實現單身人士?
語境:
我希望能夠在一個活動使用ImageDownloader
並設置透明位圖,並在另一個使用相同ImageDownloader
但使用不同的策略對象中獲取黑&白色的位圖。
你認爲你這樣做了,但你不想讓ImageDownloader成爲一個Singleton。辛格爾頓過度使用,並不適合你的情況。想一想:如果只有一個類的實例正在操作,那麼如何使用不同的策略來操作位圖?
您想要的是通過靜態方法創建ImageDownloader實例的能力,您可以在不使其成爲Singleton的情況下進行創建。這些方法被稱爲工廠方法,並且有很多好的網頁描述它們。
你可能想是這樣的:
class ImageDownloader {
static ImageDownloader createImageDownloader(Strategy s) {...}
//...
}
每次調用該方法使用相同的參數可以返回ImageDownloader的同一個實例,提供的實例不存儲狀態。這種方法的一些版本被稱爲「Multiton」。谷歌會告訴你更多。
您可以將策略作爲參數傳遞給負責圖像下載/操作的方法。
然後通過的策略將處理操作。雖然這是一個相當醜陋的黑客攻擊。查看DJClayworth對更乾淨的代碼想法的回答。
我更傾向於用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的類型也應符合您所創建的子類)。
如果你想有Singleton模式的compelte想法,怎麼能實現,請參閱本文
http://www.codinguide.com/2010/04/singleton-pattern.html
問候,
雖然我同意,他不* *其實想一個Singleton,依賴注入和需要ImageDownloader的類的工廠的組合會比靜態工廠更好。 – kyoryu 2010-08-17 16:46:17
這可能是對的。我決定保持簡單。隨意寫一個更復雜的答案。 – DJClayworth 2010-08-17 16:48:15
是的 - 實例不存儲狀態。我已經在構造函數中通過策略結束了,但將其轉換爲靜態工廠將符合我的目的。 – pixel 2010-08-17 20:22:03