[解決済み】Singleton。どのように使用するべきか
質問
編集 別の質問から、私はシングルトンに関する多くの質問/回答へのリンクがある答えを提供しました。 シングルトンについての詳しい情報はこちら。
ということで、このスレッドを読みました。
シングルトン:良いデザインか、それとも松葉づえか?
そして、議論はまだ続いている。
私はシングルトンをデザインパターンとして捉えています(良い意味でも悪い意味でも)。
シングルトンの問題は、パターンではなく、むしろユーザー(皆さんごめんなさい)にあります。誰もが、そしてその父親も、シングルトンを正しく実装できると考えている(そして、私が行った多くのインタビューによると、ほとんどの人はそうできない)。また、誰もが正しいシングルトンを実装できると考えているため、パターンを乱用し、適切でない状況で使用してしまいます(グローバル変数をシングルトンに置き換えてしまうのです!)。
そこで、答えなければならない主な質問は以下の通りです。
- シングルトンを使用するのはどのような場合か
- シングルトンを正しく実装する方法
この記事で私が望むのは、いつ(そしてどのように)シングルトンを正しく使うかについての権威あるソースを(複数のサイトをググって探すのではなく)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ではすべてのクラス定義がシングルトンになります)。
- デストラクタを用意するか、リソースを破棄する方法を何とか考える。
- 少ないメモリ使用量
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み] Androidにおけるシングルトン vs. アプリケーションコンテキスト?
-
[解決済み】C++ シングルトンデザインパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】C++ シングルトンデザインパターン