Comment mettre en œuvre des stratégies singleton?

voix
1

Je me adapte Image Downloader du blog de Google Android. Je veux ImageDownloaderêtre singleton depuis que je vais utiliser dans plusieurs endroits dans ma demande. Je veux aussi être en mesure de manipuler en Bitmapsutilisant différents Strategies(par exemple. Produire des bitmaps transparents).

Le contexte:

Je veux être en mesure d'utiliser ImageDownloaderdans une activité et mettre en bitmaps transparentes, et dans une autre utilise le même ImageDownloadermais obtenir bitmaps en noir et blanc en utilisant différents objets de stratégie.

Créé 17/08/2010 à 17:06
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
3

Vous pensez que vous faites, mais vous ne voulez pas ImageDownloader être un Singleton. Singleton est très galvaudé, et ne convient pas dans votre cas. Pensez-y: comment pouvez-vous manipuler bitmaps en utilisant différentes stratégies s'il n'y a qu'une seule instance de la classe faire la manipulation?

Ce que vous voulez est la possibilité de créer des instances de ImageDownloader via des méthodes statiques que vous pouvez faire sans en faire un Singleton. Ces méthodes sont appelées méthodes d'usine, et il y a beaucoup de bonnes pages Web qui les décrivent.

Vous voulez probablement quelque chose comme:

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

Chaque appel à la méthode avec le même argument pourrait retourner la même instance de ImageDownloader, à condition que les instances ne stockent pas d'état. Certaines versions de cette approche sont appelés « Multiton ». Google vous en dira plus.

Créé 17/08/2010 à 17:44
source utilisateur

voix
1

Je suis plus enclin à se mettre d'accord avec DJClayworth réponse, mais pour répondre à votre question, la meilleure façon de mettre en œuvre le modèle singleton est d'utiliser un 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
    }
}

Pour obtenir une prise de l'instance:

ImageDownloaderWrapper.INSTANCE.IMAGE_DOWNLOADER.download(...

Vous pouvez également profiter des importations statiques:

import static some.package.structure.ImageDownloaderWrapper.INSTANCE;

Ensuite, il est un peu plus simple:

INSTANCE.IMAGE_DOWNLOADER.download(...

Pour tenir compte des stratégies différentes, je suppose que vous auriez à étendre ImageDownloader et ajouter la logique appropriée pour traiter des stratégies dans cette sous-classe (le type de IMAGE_DOWNLOADER doit également correspondre à la sous-classe vous avez créé).

Créé 17/08/2010 à 18:35
source utilisateur

voix
0

Si vous voulez avoir idée compelte de modèle Singleton et comment il peut être mise en œuvre, consultez cet article

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

Cordialement,

Créé 17/08/2010 à 19:23
source utilisateur

voix
0

Vous pouvez passer une stratégie en tant que paramètre aux méthodes responsables de l'image téléchargement / manipulation.

Ensuite, la stratégie adoptée va gérer la manipulation. Il est un hack assez laid bien. Voir la réponse de DJClayworth pour les idées de code plus propre.

Créé 17/08/2010 à 17:45
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more