Java設計モード(一):単例設計モード(Singleton)の餓漢式
1632 ワード
単例設計モードとは?大きな白話では、Javaアプリケーションでは、クラスがメモリにインスタンスオブジェクトが1つしか存在しないことを保証します.つまり、クラスは常に1つのオブジェクトしか生成できません.単例設計モードの設計構想:
1.オブジェクトインスタンスが1つしか生成されない、すなわちオブジェクトに一意性がある以上、どうすればよいのでしょうか.まず、他のプログラムにnew形式でクラスのインスタンスオブジェクトを外部に作成させることはできません.クラスが外部(つまり他のクラス)でnewキーワードでオブジェクトを作成できる場合、複数のインスタンスオブジェクトを生成することができるからです.単例である以上、これは許されないに違いない.
2.外部でnewキーワードでクラスのインスタンスを作成できない以上、クラスのインスタンスをどのように作成しますか?簡単です.クラスの内部にクラスのインスタンスオブジェクトを作成します(メソッドではなく、静的メンバーとして、なぜ静的メンバーが必要ですか?後述します).
3.インスタンスオブジェクトを内部で作成した後、インスタンスオブジェクトに外部からアクセスする方法を指定します.では、このとき、このクラスは常にインスタンスオブジェクトを1つしか生成できません.
次に、具体的な実装手順を説明します.1.クラスをプライベート化する構造方法で、他のクラスでnewキーでクラスのインスタンスオブジェクトを作成できないことを確認します.
2.クラスの内部にクラスのインスタンスオブジェクトを作成し、静的メンバーとして宣言します.
3.作成したオブジェクトを返し、外部へのアクセスを提供する方法を定義します.
質問:なぜメンバー変数を静的に定義するのですか? まず、このクラスの构造方法が私有化されているので、外部ではそのクラスのインスタンスオブジェクトを作成することはできませんが、外部でそのクラスにアクセスする方法は、クラス名.メソッドの形式でしかアクセスできません.オブジェクト.メソッドの形式でアクセスすることはできません(オブジェクトを作成できませんから!)ので、メソッドは静的に定義する必要があります.静的メソッドでは、非静的メンバー変数にアクセスできないため、変数は静的に定義されなければならない.次に、前述の1つがなくても、この変数は静的に定義する必要があります.静的でなければ、オブジェクトを作成し続ける場合(つまり、オブジェクトを作成すると、そのオブジェクトの中にオブジェクトが作成されていることに気づき、このように逆復する)が発生し、メモリがオーバーフローするまで定義され、静的であれば発生しません.このとき、オブジェクトはクラスのロードに伴って作成されるため、その後は作成されません.以上の2点に基づいて,メンバ変数を静的に定義すべきである.これが単例設計モードにおける餓漢式設計方法である.
1.オブジェクトインスタンスが1つしか生成されない、すなわちオブジェクトに一意性がある以上、どうすればよいのでしょうか.まず、他のプログラムにnew形式でクラスのインスタンスオブジェクトを外部に作成させることはできません.クラスが外部(つまり他のクラス)でnewキーワードでオブジェクトを作成できる場合、複数のインスタンスオブジェクトを生成することができるからです.単例である以上、これは許されないに違いない.
2.外部でnewキーワードでクラスのインスタンスを作成できない以上、クラスのインスタンスをどのように作成しますか?簡単です.クラスの内部にクラスのインスタンスオブジェクトを作成します(メソッドではなく、静的メンバーとして、なぜ静的メンバーが必要ですか?後述します).
3.インスタンスオブジェクトを内部で作成した後、インスタンスオブジェクトに外部からアクセスする方法を指定します.では、このとき、このクラスは常にインスタンスオブジェクトを1つしか生成できません.
次に、具体的な実装手順を説明します.1.クラスをプライベート化する構造方法で、他のクラスでnewキーでクラスのインスタンスオブジェクトを作成できないことを確認します.
class Singleton{
private Singleton(){}
}
2.クラスの内部にクラスのインスタンスオブジェクトを作成し、静的メンバーとして宣言します.
class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
}
3.作成したオブジェクトを返し、外部へのアクセスを提供する方法を定義します.
class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
質問:なぜメンバー変数を静的に定義するのですか? まず、このクラスの构造方法が私有化されているので、外部ではそのクラスのインスタンスオブジェクトを作成することはできませんが、外部でそのクラスにアクセスする方法は、クラス名.メソッドの形式でしかアクセスできません.オブジェクト.メソッドの形式でアクセスすることはできません(オブジェクトを作成できませんから!)ので、メソッドは静的に定義する必要があります.静的メソッドでは、非静的メンバー変数にアクセスできないため、変数は静的に定義されなければならない.次に、前述の1つがなくても、この変数は静的に定義する必要があります.静的でなければ、オブジェクトを作成し続ける場合(つまり、オブジェクトを作成すると、そのオブジェクトの中にオブジェクトが作成されていることに気づき、このように逆復する)が発生し、メモリがオーバーフローするまで定義され、静的であれば発生しません.このとき、オブジェクトはクラスのロードに伴って作成されるため、その後は作成されません.以上の2点に基づいて,メンバ変数を静的に定義すべきである.これが単例設計モードにおける餓漢式設計方法である.