言葉遣いはかなり紛らわしいですが、初心者のプログラマーがまったく新しい型を作成して、そのオブジェクトの 1 つをインスタンス化することがあるということを意味していると思います。特に露骨な例として:
struct Player1Name
{
string data;
};
そこではstring player1_name;
、まったく新しいタイプを作成せずに (または複数のプレイヤーの集約でさえ) 使用することができます。そのため、クラスを使用して新しいオブジェクト (既存のタイプの新しいインスタンス) が既に実行できることをモデル化しようとする混乱が生じます。
そのような場合、開発者は何百もの新しいユーザー定義のデータ型と、場合によっては大規模な継承階層でコードベースをスパムする可能性があります。通常、既存のクラスで十分です。
本当の問題は、クラスがインスタンス化されるのは 1 回だけであるということではなく、それらの設計が適用範囲が狭すぎて、インスタンス化する価値が1 回しかないということです。
クラスは通常、インスタンス (オブジェクト) との 1 対多の関係をモデル化することを目的としています。それらは、そのクラスの単一のインスタンスを超えて、少なくともある程度一般的に適用できるはずです。大雑把に言えば、クラスは をモデル化する必要がDog
あり、隣人の特定の飼い犬ではありませんSpark
。4.2 メートル x 8.7 メートルRectangle
の正確なモデルではなく、をモデル化することになっています。Rectangle42x87
一度インスタンス化されるものを設計している場合、おそらく設計が狭すぎて、代わりに使用できる既存のものがある可能性があります。
通常、新しいデータ型は、問題のクラス (カテゴリ) に取り組むことを目的としています。いわば、そのクラスのインスタンスを 1 つだけ呼び出す非常に正確なデータ型ではありません。そうでなければ、クラスの設計は、非常に個別の問題を解決するためにあちこちに表面的にクラスを作成するだけで、より広範なアプリケーションの可能性がまったくないワンショットの取引になるでしょう.
シングルトンは、この通常のオブジェクト指向の方法でクラスを利用していないため、ルールの例外です。そこでは、グローバル アクセス ポイントを備えた、遅延構築された単一のインスタンスを意図的に作成しようとしています。したがって、開発者が一度だけインスタンス化されるように設計されたクラスを作成したのは、オブジェクト指向設計の偶然や誤解によるものではありません。これは、ツールの使い方の誤解ではなく、いわば非常に慎重で意識的な設計上の決定です。