Как реализовать синглтон со стратегиями? - PullRequest
1 голос
/ 17 августа 2010

Я адаптирую Image Downloader из блога Google Android. Я хочу, чтобы ImageDownloader был одноэлементным, так как я буду использовать его в нескольких местах в моем приложении. Я также хочу иметь возможность манипулировать Bitmaps, используя различные Strategies (например, создавать прозрачные растровые изображения).

Контекст:

Я хочу иметь возможность использовать ImageDownloader в одном упражнении и устанавливать прозрачные растровые изображения, а в другом использовать те же ImageDownloader, но получать черно-белые растровые изображения, используя другой объект стратегии.

Ответы [ 4 ]

3 голосов
/ 17 августа 2010

Вы так думаете, но не хотите, чтобы ImageDownloader был Singleton.Синглтон сильно перегружен и не подходит в вашем случае.Подумайте об этом: как вы можете манипулировать растровыми изображениями, используя разные стратегии, если манипулирует только один экземпляр класса?

Вам нужна возможность создавать экземпляры ImageDownloader с помощью статических методов, что вы можете сделатьне делая это Singleton.Эти методы называются фабричными методами, и есть много хороших веб-страниц, описывающих их.

Вы, вероятно, хотите что-то вроде:

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

Каждый вызов метода с тем же аргументом может вернутьтот же экземпляр ImageDownloader, при условии, что экземпляры не сохраняют состояние.Некоторые версии этого подхода называются «Multiton».Google скажет вам больше.

1 голос
/ 17 августа 2010

Я более склонен согласиться с ответом DJClayworth, но, чтобы ответить на ваш вопрос, лучший способ реализовать шаблон синглтона - это использовать enum:

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 также должен соответствовать созданному вами подклассу).

0 голосов
/ 17 августа 2010

Если вы хотите получить общее представление о шаблоне Singleton и о том, как его можно реализовать, обратитесь к этой статье

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

С уважением,

0 голосов
/ 17 августа 2010

Вы можете передать стратегию в качестве параметра методам, отвечающим за загрузку / обработку изображений.

Тогда пройденная стратегия будет обрабатывать манипуляции.Это довольно уродливый хак.См. Ответ DJClayworth для более чистых идей кода.

...