JAva単例モードにおける餓漢式と怠け者式
2574 ワード
単一モードの用途:
単一のモードはファクトリモードの特例に属しますが、パラメータを入力する必要はなく、常に同じオブジェクトの参照を返します.
単一のモードでは、システム内のクラスのインスタンスが1つしかないというタイプのオブジェクトの一意性を保証できます.その用途は非常に広く、例えば、ユーザーのメッセージごとにメッセージ情報をデータベースに書き込む簡単な伝言板を開発しました.最も直感的な方法は、書き込みをしないでデータベースのリンクを構築することです.これは簡単な方法で、合併を考えないときにもいい選択です.しかし、実際には、1つのサイトは同時であり、大量の同時操作がある可能性があります.書き込みのたびにデータベース接続を作成すると、簡単なシステムにボトルネックが発生し、直接クエリー操作ではなくメンテナンスリンクに多くの力がかかります.これは明らかに望ましくない.
システムに唯一のデータベース接続オブジェクトが最初から最後まで存在することを保証できれば、メモリのオーバーヘッドとcpuの使用率を大幅に節約できることは明らかです.これが単例モードの用途である.もちろん、単一のモードは、このような場合にのみ使用されるわけではない.
「設計モード:オブジェクト向けソフトウェアの多重化の基礎」という本では、単一のモードの適用性について以下のように説明しています.
1.クラスにインスタンスが1つしかなく、お客様がよく知られているアクセスポイントからアクセスできる場合.
2、この唯一のインスタンスがサブクラス化によって拡張可能であるべきであり、お客様がコードを変更することなく拡張インスタンスを使用できるべきである場合.
以下、単例モードの餓漢式と怠け者式について簡単に紹介する。
1、餓漢式:プログラム起動または単一モードクラスがロードされたときに、単一モードインスタンスが作成された.
2、怠け者:プログラムが初めて単例モードインスタンスにアクセスしたときに作成されます.
選択方法:
単一のモードインスタンスがシステムでよく使用される場合、餓漢式は良い選択である.
逆に、あまり使われていない場合は、怠け者式がいい選択です.
餓漢式:
設計思想:構造方法は私有であり、外部では対象をインスタンス化できないことを保証する.次に、内部で静的定数オブジェクトを定義し、staticメソッドを書いてこのオブジェクトを返します.これにより、前後のオブジェクトであることが保証されます.
【コード実装】
public class HungryManSingleton {
/**
*
*/
private HungryManSingleton() {
// TODO Auto-generated constructor stub
}
/**
*
*/
private static final HungryManSingleton hungryMan = new HungryManSingleton();
/**
*
*/
public static HungryManSingleton getInstance() {
return hungryMan;
}
}
一般的に列挙法に使用されます.
enum Single {
Single;
private Single() {
}
public void print(){
System.out.println("hello world");
}
}
public class SingleDemo {
public static void main(String[] args) {
Single a = Single.Single;
a.print();
}
怠け者:
【コード実装】
public class LazySingleton {
private LazySingleton() {
// TODO Auto-generated constructor stub
}
private static LazySingleton lazySingleton;
public synchronized static LazySingleton getInstance() {
if (lazySingleton == null) {
System.out.println(" 。");
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
違い:餓漢式はインスタンスを先に定義し、怠け者式はリファレンスを先に定義し、怠け者式がgetInstanceを初めて呼び出したときにオブジェクトのインスタンス化操作を行う.もちろん,ここでは,複数のスレッドが同時にこのメソッドを呼び出す場合に問題が発生することを考慮して,同期ロックsynchronizedを加えて,同じ時刻に1つのスレッドのみがメソッドに入ることを保証する.
記事の出典:
https://www.cnblogs.com/nolonely/p/5927957.html
http://blog.java1234.com/blog/articles/197.html