我正在改编来自 Google Android 博客的Image Downloader 。我想ImageDownloader
成为单身人士,因为我将在我的应用程序的多个地方使用它。我还希望能够Bitmaps
使用不同的方式进行操作Strategies
(例如生成透明位图)。
语境:
我希望能够ImageDownloader
在一个活动中使用并设置透明位图,而在另一个活动中使用相同ImageDownloader
但使用不同的策略对象获取黑白位图。
我正在改编来自 Google Android 博客的Image Downloader 。我想ImageDownloader
成为单身人士,因为我将在我的应用程序的多个地方使用它。我还希望能够Bitmaps
使用不同的方式进行操作Strategies
(例如生成透明位图)。
语境:
我希望能够ImageDownloader
在一个活动中使用并设置透明位图,而在另一个活动中使用相同ImageDownloader
但使用不同的策略对象获取黑白位图。
您认为您可以,但您不希望 ImageDownloader 成为单例。Singleton 被过度使用,不适合您的情况。想一想:如果只有一个类的实例进行操作,您如何使用不同的策略来操作位图?
您想要的是能够通过静态方法创建 ImageDownloader 的实例,而无需将其设为 Singleton。这些方法称为工厂方法,有很多很好的网页描述它们。
你可能想要这样的东西:
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 的答案。