シングルトンの非常に優れた包括的な概要が記載されている このページに出くわしました。
一般的な「シングルトンは、プライベート コンストラクターと 1 つのグローバル インスタンスのみを持つクラスです」の代わりに、次のようにシングルトンを説明します。
「シングルトン」の意味を正確に定義することが重要です。
この引数の目的上、シングルトンとは、スタックから開始せずに到達できる(つまり、静的変数またはグローバル変数から到達できる) 任意の変更可能な状態です。
通常、シングルトンは作成者がインスタンスが 1 つしか存在しないことを期待するクラスです。ただし、私たちの目的では、グローバルにアクセスできるオブジェクトはすべてカウントされます。
例:
- 共有された変更可能な状態を操作する一連の関数 (または静的メソッド) は、シングルトンを構成します。
- シングルトン A が可変オブジェクト B への参照を提供する場合、B もシングルトンです。
- これは、シングルトン コレクションの可変メンバーはすべて、それ自体がシングルトンであることを意味します。
- 推移的に不変のオブジェクトは、グローバルにアクセスできる場合でもシングルトンではありません。定数です。
- コードが不変であると仮定すると、シングルトンにアクセスしないスタンドアロン関数自体はシングルトンではありません。
...
open() や stdout はどうですか?
これらはシングルトンの最悪の例です!
...
これは、本質的に、malloc
、new
、shared_ptr
、または言語がヒープメモリにアクセスするために使用するものは何でも、これらはすべてシングルトンを使用していることを意味します!
しかし、このためにヒープ割り当てを避ける必要があるとは誰も言いません。メモリ割り当てはどこでも見落とされているようです! 私が引用したページでさえ、彼らはロギングについて言及open()
しstdout
ていますが、ヒープメモリの割り当てについては決して言及していません。これは、一方通行ではないため、ロガーなどより明らかに「危険」です。
だから私の質問は、メモリ割り当てはルールの例外ですか(なぜですか?)、それともシングルトンの悪い例ですか?
シングルトンの新しい使用が同じ「例外的な」カテゴリに該当するかどうかを判断するにはどうすればよいですか?
new
(明らかな理由で言語に依存しないタグを付けますが、ユーザーが動作を変更してよりグローバルな状態を導入できるようにするため、特に C++ に関連していると思うので、C++ としてタグ付けします。)