[英]How to implement singleton with strategies?
我正在調整Google Android博客中的Image Downloader 。 我希望ImageDownloader
是單例,因為我將在我的應用程序中的多個位置使用它。 我還希望能夠使用不同的Strategies
來操作Bitmaps
(例如,生成透明位圖)。
語境:
我希望能夠在一個活動中使用ImageDownloader
並設置透明位圖,而在另一個活動中使用相同的ImageDownloader
但使用不同的策略對象獲取黑白位圖。
你認為你這樣做,但你不希望ImageDownloader成為Singleton。 Singleton非常過度使用,在您的情況下不合適。 想一想:如果只有一個類的實例在進行操作,那么如何使用不同的策略來操作位圖?
你想要的是能夠通過靜態方法創建ImageDownloader的實例,你可以在不使它成為單例的情況下完成。 這些方法稱為Factory方法,並且有許多描述它們的好網頁。
你可能想要這樣的東西:
class ImageDownloader {
static ImageDownloader createImageDownloader(Strategy s) {...}
//...
}
每次調用具有相同參數的方法都可以返回相同的ImageDownloader實例,前提是實例不存儲狀態。 這種方法的某些版本被稱為“Multiton”。 谷歌會告訴你更多。
我更傾向於同意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的類型也應該對應於你創建的子類)。
您可以將策略作為參數傳遞給負責圖像下載/操作的方法。
然后通過的策略將處理操作。 雖然這是一個相當丑陋的黑客。 請參閱DJClayworth的答案,了解更清晰的代碼創意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.