繁体   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