-2
java version 1.7.0_65

シングルトン デザイン パターン クラスがあります。これにより、最初に作成されたものと同じインスタンスが常に返されます。

ただし、私が抱えている問題は、このクラスが別のクラスから他の多くのオブジェクトを作成する必要があることです。これにはコンポジションを使用しました( のPOIクラスのインスタンスArlabFacade)。このシングルトン インスタンスから、クライアントは多くの POI オブジェクトを作成できるはずです。また、POI クラスの内部動作を公開したくありません。すべてがシングルトン インスタンスを通過する必要があります。

private static ArlabFacade mArlabFacade = null;
private POI mPoi; /* Should be able to create many object of this class */

private ArlabFacade(Context context) {     
        /* initialize properties */
        mContext = context;

        mPoi = null;
    }

public static ArlabFacade getInstance(Context context) {

        /* Create a synchronised singleton instance */
        ReentrantLock lock = new ReentrantLock();
        lock.lock();
        if(mArlabFacade == null) {
            mArlabFacade = new ArlabFacade(context);
        }
        lock.unlock();

        return mArlabFacade;
    }

私はこのようなことを試みましたが、2つの問題があります。

1) I don't want to return the class instance of POI
2) because I only have a single instance the mPoi will be overwritten by the next client call to this function. 

この関数は単に上書きします:

 public POI createNewPOI() {
        return mPoi = new POI();
    }

この問題に対処する設計パターンはありますか?

4

5 に答える 5

6

あなたが何を達成しようとしているのか、私は少し混乱しています。Factory、つまり、特定のクラスのオブジェクトを作成する方法を隠すクラスが必要なようです。その場合、他の理由がない限り、シングルトンは必要ありません。

あなたの問題に関して:

  1. インスタンスを返すのではなくclass、そのクラスのオブジェクトを返します。POI オブジェクト ant を作成してそれを返すというのが要点だと思いました。命名法について混乱があると思いますので、クラスインスタンスの意味と、それを返したくない理由を説明してください。

  2. ファクトリ メソッドcreateNewPOI()では、オブジェクト自体ではなく、最後に作成された POI オブジェクトへの参照を上書きするだけです。ファクトリ クラス (またはシングルトン) が POI オブジェクト自体で何かを行っていない限り、参照を保持する必要はありません。メソッドの呼び出し元にオブジェクトを返します。その後、それを忘れることができます:

.

public POI createNewPOI() {
    return new POI();
}

コードにはもう 1 つ問題がありますgetInstance()。メソッド内でのロックが機能しません。ReentrantLock が機能するには、複数のスレッド間で共有する必要があります。あなたの場合、各スレッドは、他のスレッドを知らずに、ロックの独自のコピーを作成します。

最も簡単な方法は、メソッドを同期させることです。

public static synchronized ArlabFacade getInstance(Context context) {

    if(mArlabFacade == null) {
        mArlabFacade = new ArlabFacade(context);
    }

    return mArlabFacade;
}
于 2014-09-19T05:32:43.450 に答える
6

見てみましょう:シングルトンの何がそんなに悪いのか?

理由がある場合にのみ、コード パターンを使用する必要があります。例: opular パターンとそれらを使用する理由は次のとおりです。

創造のパターン

  • 抽象ファクトリ クラスのいくつかのファミリのインスタンスを作成します
  • Builder オブジェクトの構築をその表現から分離します
  • ファクトリ メソッド複数の派生クラスのインスタンスを作成します
  • プロトタイプ コピーまたは複製される完全に初期化されたインスタンス
  • シングルトン 単一のインスタンスしか存在できないクラス

構造パターン

  • 異なるクラスのAdapter Match インターフェイス
  • ブリッジオブジェクトのインターフェースをその実装から切り離します
  • 複合 単純な複合オブジェクトのツリー構造
  • デコレーター オブジェクトに責任を動的に追加する
  • Facadeサブシステム全体を表す単一のクラス
  • Flyweight 効率的な共有に使用されるきめの細かいインスタンス
  • プロキシ 別のオブジェクトを表すオブジェクト

行動パターン

  • 反応の連鎖 オブジェクトのチェーン間でリクエストを渡す方法
  • Command コマンド要求をオブジェクトとしてカプセル化する
  • インタープリター プログラムに言語要素を組み込む方法
  • イテレータ コレクションの要素に順次アクセスする
  • Mediator クラス間の簡素化された通信を定義します
  • オブジェクトの内部状態をキャプチャして復元する
  • オブザーバー いくつかのクラスへの変更を通知する方法
  • 状態 状態が変化したときにオブジェクトの動作を変更します
  • ストラテジー クラス内にアルゴリズムをカプセル化します
  • テンプレートメソッド アルゴリズムの正確なステップをサブクラスに任せる
  • Visitor 変更なしでクラスに新しい操作を定義します

出典:ドファクトリー

于 2014-09-24T12:34:56.373 に答える