1. ホーム
  2. c++

[解決済み】Singleton。どのように使用するべきか

2022-03-30 10:11:44

質問

編集 別の質問から、私はシングルトンに関する多くの質問/回答へのリンクがある答えを提供しました。 シングルトンについての詳しい情報はこちら。

ということで、このスレッドを読みました。 シングルトン:良いデザインか、それとも松葉づえか?

そして、議論はまだ続いている。

私はシングルトンをデザインパターンとして捉えています(良い意味でも悪い意味でも)。

シングルトンの問題は、パターンではなく、むしろユーザー(皆さんごめんなさい)にあります。誰もが、そしてその父親も、シングルトンを正しく実装できると考えている(そして、私が行った多くのインタビューによると、ほとんどの人はそうできない)。また、誰もが正しいシングルトンを実装できると考えているため、パターンを乱用し、適切でない状況で使用してしまいます(グローバル変数をシングルトンに置き換えてしまうのです!)。

そこで、答えなければならない主な質問は以下の通りです。

  • シングルトンを使用するのはどのような場合か
  • シングルトンを正しく実装する方法

この記事で私が望むのは、いつ(そしてどのように)シングルトンを正しく使うかについての権威あるソースを(複数のサイトをググって探すのではなく)1つの場所に集めることです。また、アンチ・ユースメントや一般的な悪い実装のリストも、なぜうまくいかないのか、良い実装の場合はその弱点が説明されていることが適切でしょう。


では、さっそくボールを回してみましょう。

これは私が使っているものですが、おそらく問題があると手を挙げます。

私は、Scott Myersの著書「Effective C++」でのこのテーマの扱いが好きです。

<ブロッククオート

シングルトンを使用する良い場面(多くはない)。

  • ロギングフレームワーク
  • スレッドリサイクルプール
/*
 * C++ Singleton
 * Limitation: Single Threaded Design
 * See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
 *      For problems associated with locking in multi threaded applications
 *
 * Limitation:
 * If you use this Singleton (A) within a destructor of another Singleton (B)
 * This Singleton (A) must be fully constructed before the constructor of (B)
 * is called.
 */
class MySingleton
{
    private:
        // Private Constructor
        MySingleton();
        // Stop the compiler generating methods of copy the object
        MySingleton(MySingleton const& copy);            // Not Implemented
        MySingleton& operator=(MySingleton const& copy); // Not Implemented

    public:
        static MySingleton& getInstance()
        {
            // The only instance
            // Guaranteed to be lazy initialized
            // Guaranteed that it will be destroyed correctly
            static MySingleton instance;
            return instance;
        }
};

OKです。批判や他の実装を一緒にしてみましょう。

:-)

解決方法は?

回答

以下の場合はシングルトンを使用します。

  • システム内に1つの型のオブジェクトを1つだけ持つ必要があります。

以下の場合は、シングルトンを使用しないでください。

  • メモリを節約したい
  • 新しいことに挑戦したい
  • 自分がどれだけ知っているかをアピールしたい
  • みんながやっているから(参照 カーゴカルトプログラマー wikipediaより)
  • ユーザーインターフェースウィジェットにおいて
  • キャッシュであることが前提
  • 文字列で
  • セッション
  • 一日中通える

最高のシングルトンの作り方。

  • 小さければ小さいほどいい。私はミニマリストです
  • スレッドセーフであることを確認する
  • ヌルでないことを確認する
  • 一度だけ作成されることを確認する
  • 怠慢な初期化、それともシステム初期化?要件次第
  • OSやJVMがシングルトンを作成することもあります(例:Javaではすべてのクラス定義がシングルトンになります)。
  • デストラクタを用意するか、リソースを破棄する方法を何とか考える。
  • 少ないメモリ使用量