【问题标题】:How to implement singleton with strategies?如何用策略实现单例?
【发布时间】:2010-08-17 16:06:18
【问题描述】:

我正在改编来自 Google Android 博客的 Image Downloader。我希望ImageDownloader 成为单例,因为我将在我的应用程序的多个位置使用它。我还希望能够使用不同的Strategies 操作Bitmaps(例如生成透明位图)。

上下文:

我希望能够在一个活动中使用ImageDownloader 并设置透明位图,而在另一个活动中使用相同的ImageDownloader 但使用不同的策略对象获取黑白位图。

【问题讨论】:

    标签: java android design-patterns singleton strategy-pattern


    【解决方案1】:

    您认为您有,但您不希望 ImageDownloader 成为单例。 Singleton 被过度使用,不适合您的情况。想一想:如果只有一个类的实例进行操作,您如何使用不同的策略来操作位图?

    您想要的是能够通过静态方法创建 ImageDownloader 的实例,而无需将其设为 Singleton。这些方法称为工厂方法,有很多很好的网页描述它们。

    你可能想要这样的东西:

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

    每次调用具有相同参数的方法都可以返回相同的 ImageDownloader 实例,前提是这些实例不存储状态。这种方法的一些版本被称为“Multiton”。谷歌会告诉你更多。

    【讨论】:

    • 虽然我同意他实际上不想要一个 Singleton,但是对于需要 ImageDownloader 的类,依赖注入和工厂的组合会比静态工厂更好.
    • 这可能是真的。我决定保持简单。随意写一个更复杂的答案。
    • 是的——实例不存储状态。我以在构造函数中传递的 Strategy 结束,但将其转换为静态工厂将符合我的目的。
    【解决方案2】:

    我更倾向于同意 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 的类型也应该对应于你创建的子类)。

    【讨论】:

      【解决方案3】:

      您可以将策略作为参数传递给负责图像下载/操作的方法。

      然后传递的策略将处理操作。这是一个相当丑陋的黑客。有关更简洁的代码创意,请参阅 DJClayworth 的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多