1

GoogleAndroidブログのImageDownloaderを採用しています。ImageDownloaderアプリケーションの複数の場所で使用するため、シングルトンになりたいです。Bitmapsまた、さまざまな方法を使用して操作できるようにしたいStrategies(たとえば、透明なビットマップを作成する)。

コンテクスト:

ImageDownloaderあるアクティビティで使用して透明なビットマップを設定し、別のアクティビティで同じImageDownloaderものを使用して、異なる戦略オブジェクトを使用して白黒のビットマップを取得できるようにしたい。

4

3 に答える 3

3

あなたはそう思うが、ImageDownloaderをシングルトンにしたくない。シングルトンは非常に使い古されており、あなたの場合には適切ではありません。考えてみてください。操作を行うクラスのインスタンスが1つしかない場合、さまざまな戦略を使用してビットマップを操作するにはどうすればよいでしょうか。

必要なのは、静的メソッドを介してImageDownloaderのインスタンスを作成する機能です。これは、シングルトンにすることなく実行できます。これらのメソッドはファクトリメソッドと呼ばれ、それらを説明する多くの優れたWebページがあります。

あなたはおそらく次のようなものが欲しいでしょう:

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

インスタンスが状態を保存しない場合、同じ引数を使用してメソッドを呼び出すたびに、ImageDownloaderの同じインスタンスが返される可能性があります。このアプローチの一部のバージョンは、「マルチトン」と呼ばれます。Googleが詳細を教えてくれます。

于 2010-08-17T16:44:09.640 に答える
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のタイプも作成したサブクラスに対応している必要があります)。

于 2010-08-17T17:35:49.690 に答える
0

画像のダウンロード/操作を担当するメソッドにパラメータとして戦略を渡すことができます。

次に、渡された戦略が操作を処理します。しかし、それはかなり醜いハックです。よりクリーンなコードのアイデアについては、DJClayworthの回答を参照してください。

于 2010-08-17T16:45:00.667 に答える