2011-12-18 11 views
4

Javaでのシングルトンを実装する最も一般的な方法は、フォームのパブリックアクセサメソッドでプライベートコンストラクタを使用することです - コンストラクタはプライベートであるため、シングルトン

public class Singleton { 
    private static Singleton instance = null; 
    private Singleton() { 

    } 
    public static synchronized Singleton getInstance(){ 
     if (instance == null) { 
     instance = new Singleton();   
     } 
     return instance; 
    } 
} 

しかし、それをシングルトンのサブクラス化を防ぎます。サブクラス化を可能にするシングルトンを作成する方法はありますか?

+0

http://stackoverflow.com/questions/2459061/how-can-i-implement-an-abstract-singleton-class-in-java – Dave

+0

シングルトンを実装する最も一般的な方法は、 1つのインスタンスを持つ列挙型。 –

+1

これは「より良い」方法かもしれませんが、最も一般的な方法ではありません。私が取り組んだプロジェクトでは、上に示したようにシングルトンが実装されています。また、ネット上のシングルトンに関する記事をチェックしてください。これは私が見つけたものです。 – user496934

答えて

6

class A extends Bの場合、Aのインスタンスは、実質的にBのインスタンスを「包含」します。したがって、継承の概念はシングルトンモデルに反します。

必要なものによっては、作曲/委任の使用を検討します。 (Aはそのクラスを拡張するのではなく、シングルトンを参照します)。何らかの理由で継承が必要な場合は、Singletonメソッドとのインターフェイスを作成し、そのインターフェイスをSingletonに実装させ、別のクラスにもそのインターフェイスを実装させ、関連メソッドを実装するためにシングルトンに委譲します。

+0

この文を「シングルトンに反する」と説明できますか?あなたが基本的にクラスにシングルトンの機能を再利用させているので、それを拡張することは本当に何も壊しませんか? – Boon

+1

@Boon人がシングルトンについて話すとき、おそらく、「instanceof TheSingleton」が真であるオブジェクトが1つしかないことを意味します。これは継承では保持されません。なぜなら、 'A'のインスタンスは' B'のインスタンスでもあるからです。 – yshavit

9

継承できるのであれば、継承された各クラスに少なくとも1つのインスタンスがあるため、実際にはシングルトンではありません。

ただし、コンストラクタを作成することができます。protected

+1

メソッドがプライベートとマークされている時間の90%はおそらく保護されているはずです。 – jiggy

+0

@jiggy:継承の設計で問題となるのは、ほぼすべての変更を大幅に変更することです。継承されるように設計されていない第三者のクラスを継承することは、あらゆる種類の微妙な問題(特に再入門)を導入し、コードを非常に脆弱にする可能性があります。 – SLaks

+0

ありがとうございます。シングルトンクラスのコンストラクタを 'protected 'にする目的は何ですか?それをコンストラクタ 'protected'にすることは、シングルトンクラスがサブクラスを持つことを妨げないでしょうか? – Tim

0

いくつかのシングルトンの継承可能な動作を提供したいと考えていますか?もしそうなら、あなたはそのコードを抽象クラスに移すことができます。

SLakが指摘しているように、シングルトンを拡張することはもはやシングルトンパターンにはなりません。