3

シングルトンパターンに出くわしました。違いがわかりませんでした

singletonobj.getinstance().dosomething() //1st one

singletonobj.dosomething() //2nd one

getinstance()2番目のケースでは行われていないのですが、どうしますか?

4

3 に答える 3

9

まあ、技術的にsingletonobj.getinstance()は冗長です。なぜなら、それはあなたがすでにオブジェクトを手に入れていることを意味するからです。

通常、呼び出しは次のようになります。

SingletonClass::getinstance().dosomething();

また

singletonobj.dosomething()

オブジェクトをプリフェッチした場合-つまり、以前に

SingletonClass& singletonobj = SingletonClass::getinstance();
于 2012-10-03T11:34:01.760 に答える
2

まず、singletonobj間違った/紛らわしい名前です。シングルトンは、次のようにクラスベースで呼び出されます。

Log::getInstance().doSomething();

ではなく

Log log = new Log;
log.getInstance().doSomething();

だからこれは質問に答えるはずですが、とにかく詳しく説明します:)

Log::doSomething();

doSomething()静的なメソッドになるように強制しますが、

Log::getInstance().doSomething();

doSomething()インスタンスメソッドとして持っています。

なぜ使用するのgetInstance()ですか?シングルトンは、その定義上、ゼロまたは1つのインスタンスのみを持つ必要があるためです。シングルトンのコンストラクターをプライベートにし、メソッドを公開するgetInstance()ことで、このクラスのインスタンスの数を制御できます。プライベートコンストラクターは、他のクラスがこのクラスをインスタンス化するのを避けるためのものです。このクラスのインスタンスの数を制御できないため、このクラスがシングルトンであるという目的が損なわれます。

class SingletonExample {

    private:
    static SingletonExample* instance = NULL;

    SingletonExample() { }

    public:

    static SingletonExample getInstance() {

        if (instance == NULL) {
            instance = new SingletonExample;
        }

        return *instance;
    }

    void doSomething() {            
        // Do something :)
    }


}
于 2012-10-03T11:39:11.667 に答える
1

最初の例は通常のメソッドを呼び出しているのに対し、2番目の例は静的メソッドを呼び出しているように見えます。

シングルトンデザインパターンは、特定のオブジェクトの単一のインスタンスのみが常にインスタンス化されることを保証します。最初の例では、上記のインスタンスを返し、オブジェクトのインスタンスを使用してメソッドを呼び出します。

2番目の例は、オブジェクトのインスタンスを必要とせず、実際にはシングルトンデザインパターンを無効にする静的メソッドを使用しているようです...

于 2012-10-03T11:33:48.373 に答える