2010-12-08 10 views
3

デザインでは、Singletonパターンでコンストラクタをプライベートとしてマークし、同じ型インスタンスのプライベートスタティックメンバを再作成する作成メソッドを提供する必要があります。私はこのような私のシングルトンクラスを作成しました。シングルトンクラスの保護されたコンストラクタを作成する必要がありますか?

public class SingletonPattern {// singleton class 

    private static SingletonPattern pattern = new SingletonPattern(); 

    private SingletonPattern() { 

    } 

    public static SingletonPattern getInstance() { 
     return pattern; 
    } 

} 

ここで、シングルトンクラスを拡張して新しい動作を追加する必要があります。しかし、プライベートコンストラクタは、子クラスを定義することはできません。私はシングルトンベースクラスのための保護されたコンストラクタにデフォルトのコンストラクタを変更することを考えていた。

コンストラクタをprotectedと定義すると、何が問題になりますか?あなたが相続を経由してシングルトンクラスを拡張する場合は、専門家の意見を探してい

....

答えて

6

、誰かがあなたのシングルトンと、元のシングルトンをつかむべきで走り回っているシングルトンクラスの2つのインスタンスを持っています。

オリジナルのシングルトンが概念的に本当にシングルトンであると想定されている場合は、コンポジションを使用するのがおそらく道のりです。しかし、代入可能性は失われます(あなたのクラスは元のシングルトンで代用可能ではなく、単にそれを使用するだけです)。

具体的な例がありますか?

1

これを行うと、それはシングルトンではありません。しかし、おそらくあなたは本当にシングルトンを必要としません。

0

これはシングルトンクラスではありません。私はgetInstance()静的メソッドnを何度も呼び出すことができ、このクラスのn個のオブジェクトを持つことができるので、シングルトンパターンに完全に違反しているとします。それをシングルトンにするには、getInstance()メソッドでオブジェクトがすでに作成されているかどうかを確認する必要があります。既に作成されている場合は、無視して再度作成しないでください。たとえば、あなたは何か同様のことができます、構文の間違いを無視してください、単に説明するコードは、異なる言語で異なることができます。私が知っているが、この時につまずくために起こったと私は有益な何かを追加することができると思う

public class SingletonPattern {// singleton class 

private static SingletonPattern pattern = new SingletonPattern(); 

private SingletonPattern() { 

} 

public static SingletonPattern getInstance() { 
    if(SingletonPattern == null) { 
     return new SingletonPattern(); 
    } 
} 
0

古い質問です。

シングルトンクラスで保護されたコンストラクタを使用することは可能です。シングルトンに対して多態的な振る舞いをする場合、それを抽象クラスにすることができます。コンストラクタをprotectedに設定し、具体的なサブクラスの1つにインスタンスの作成を委譲します。

著書「デザインパターンを説明」に、私は次の例が見つかりました:

abstract public class Tax{ 
    static private Tax instance; 

    protected Tax() {}; 

    abstract double calcTax(double qty, double price); 

    public static Tax getInstance() { 
     // code to determine what implementing class to use 
     instance = USTax.getInstance(); 
     return instance; 
    } 
} 

public class USTax extends Tax { 
    private static USTax instance; 
    private USTax() { 
    // instantation local members + Tax abstract class 
} 

public double calcTax (double qty, double price){ 
    // implementation 
} 

public static Tax getInstance() { 
    if(instance == null) 
     instance = new USTax(); 
    return instance; 
    } 
} 
関連する問題