簡體   English   中英

如何用策略實現單例?

[英]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的答案,了解更清晰的代碼創意。

如果您想了解Singleton模式以及如何實現它,請參閱本文

http://www.codinguide.com/2010/04/singleton-pattern.html

問候,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM