インタビューの質問に答える方法:シングルトンとは何ですか? [閉まっている]
-
03-07-2019 - |
質問
S.Oの質問を読みました。シングルトンに関して、1時間のGoogleテクノロジートークを見ました。私の知る限り、オブジェクト指向の世界でのコンセンサスは、シングルトンは有用なデザインパターンというよりもアンチパターンのようなものであると思われます。
とはいえ、最近インタビューをしていると、質問がたくさん出てきます。シングルトンとは何ですか、どのように使いますか?
この質問に答える最良の方法は何ですか?単純に設計パターンを説明し、聞いたことがある唯一の受け入れられる用途はロギングであり、グローバルステートではよく誤用されると言うべきですか?
解決
トリッキー。あなたが言ったように、シングルトンは本質的にアンチパターンであると感じている人はたくさんいます(私も含まれています)が、それは単にグローバルを行うOOP許容可能な方法であると感じる人もたくさんいます。
インタビュアーがそのキャンプにいるのなら、はい、彼は間違っていると思いますが、インタビュー中にそれを言うのは最良のことではないかもしれません。 ;)
だから私はおそらく中立になり、事実に固執しようとするでしょう。あなたはあなたのインタビュアーがどのキャンプに入るのか分からないので、議論の余地のない事実に固執してください。シングルトンは何をしますか?そして、使用法を実証するために、ほとんどの人がシングルトンが受け入れられる答えであることに同意できる少数のケースに固執します。または、あなたの経験を説明してください(人々もそれに反対できないため)。
しかし、あなたが「のために」あるかどうかまたは" against"シングルトン、インタビューはおそらくその原因のための十字軍にふさわしい時ではありません。 ;)
他のヒント
それを使用する/使用しないというあなた自身の経験で行ってください。それはいつでも最高の答えです。まだ使用していないが、それが何であるかを知っている場合は、先に進んでそのように言ってください。ほとんどの場合、シングルトンを超えてベンチャーしないのはインタビュアーです。
ディスカッションの準備ができている限り、提案された答えは良いものだと思います。しかし、私たちの中には、まだシングルトンが有用なアイデアであることに気づいていることに注意してください。一部のデータは自然に範囲がグローバルであり、シングルトンはそのデータを抽象化する賢明な手段を提供します。もちろん、特定のネームスペース内など、より制限されたスコープでシングルトンを使用することもできます(言語がそのような構成をサポートしている場合)。
シングルトン。
定義により、これはアプリケーション全体で1つのインスタンスのみを持つオブジェクトです。これは、コンストラクターをプライベートにし、オブジェクト定義のパブリックプロパティを介して静的インスタンスを提供することで保証できます。
一度に1つのオブジェクトのみがアクセスできるリソースを処理する場合に便利なパターンです。
ただし、多くのトレードオフがあります。多くのシングルトンインスタンスには、テスト対象のクラスの前提条件と同様に前提条件も満たす必要があるため、それを使用するクラスをテストするための独自の要件があります。
さらに、プロジェクトを維持し、抽象化の一部を変更しようとすると、問題になる可能性があります。したがって、インターフェイスを介してシングルトンを抽象化するのが最善であると思います。 「単一インスタンス」を保持する実装の詳細として、インターフェイスとしてシングルトンインスタンスを渡します。これは、呼び出しコードがクラス定義(および静的プロパティ)に関連付けられていないことを意味します。これにより、アーキテクチャの配管を犠牲にして、後日テストと抽象化が容易になります(たとえば、Ctorsまたはsetterプロパティに渡す)。
世界がGoFの前に存在したことを皆に思い出させて、シングルトンパターンの変更を使用して、セッションごと、スレッドごと、または何かごとに1つのインスタンスのみを確保することもできます。セッションごと、スレッドごと、または状態ごとに単純に使用して、インスタンスごとに1つを保持します。
私の答え:
さあ、少なくともあなたは見つけることができなかった second 最も人気のある質問 この疲れた古い主題?あなたは最初に行かなければなりませんでしたか?私は行きます。 インタビューは終わりました。
またはそうなると…
私の答えは次のようになります:
シングルトンは、 保証する方法を指定します オブジェクトのインスタンスは1つだけ存在します ランタイム。
慎重に使用します。
状態のないシングルトンはどうですか?具体的には、ストラテジーパターンで可能なべき等の具体的なストラテジー、純粋なアルゴリズム、データなしなどです。
またはJava Enumクラス。これはシングルトンです。次のようなものが便利だと思います:
public enum StringComparator implements Comparator {
CASE_SENSITIVE {
int compare(Object lhs, Object rhs) {
// check for null omitted for brevity
return lhs.equals(rhs);
}
},
CASE_INSENSITIVE {
int compare(Object lhs, Object rhs) {
return String.CASE_INSENSITIVE_ORDER( lhs, rhs ) ;
}
};
boolean equals( Object o ) {
return this == o ;
}
}
私が遭遇したいくつかの用途があります。ロギングは明らかです。もう1つは、nCursesを使用したコンソール出力です。 Panelオブジェクトを使用するライブラリを作成しましたが、それぞれがzオーダーなどを制御する単一のコントローラーと通信する必要がありました。もう1つは、ゲーム用の乱数ジェネレーターです。すべての機能でそのメルセンヌツイスターを再シードするか、それをどこにでも渡したいですか?
しかし、ほとんどの部分で、それらは悪いデザインを引き起こします。