我正在调整Google Android博客中的Image Downloader。我希望ImageDownloader
成为单身,因为我将在我的应用程序中的多个位置使用它。我还希望能够使用不同的Bitmaps
操纵Strategies
(例如,生成透明位图)。
上下文:
我希望能够在一个活动中使用ImageDownloader
并设置透明位图,而在另一个活动中使用相同的ImageDownloader
,但使用不同的策略对象获取黑色和白色位图。
答案 0 :(得分:3)
你认为你这样做,但你不希望ImageDownloader成为Singleton。 Singleton非常过度使用,在您的情况下不合适。想想看:如果只有一个类的实例在进行操作,你如何使用不同的策略来操作位图?
你想要的是能够通过静态方法创建ImageDownloader的实例,你可以在不使它成为单例的情况下完成。这些方法称为Factory方法,有很多很好的网页描述它们。
您可能需要以下内容:
class ImageDownloader {
static ImageDownloader createImageDownloader(Strategy s) {...}
//...
}
对具有相同参数的方法的每次调用都可以返回ImageDownloader的相同实例,前提是实例不存储状态。这种方法的某些版本被称为“Multiton”。谷歌会告诉你更多。
答案 1 :(得分:1)
我更倾向于同意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的类型也应该对应于你创建的子类)。
答案 2 :(得分:0)
您可以将策略作为参数传递给负责图像下载/操作的方法。
然后传递的策略将处理操作。虽然这是一个相当丑陋的黑客。请参阅DJClayworth的答案,了解更清晰的代码创意。
答案 3 :(得分:0)