シングルモード★★★★☆
4620 ワード
一、単例モードとは何か
クラスにグローバルインスタンスが1つしかありません
二、補足説明
一般に、その構造方法をプライベートとし、そのインスタンスを取得できる静的方法を提供する.
Javaには反射メカニズムがあり、プライベート構造方法でも外部で作成できるため、一般的な書き方は厳密には単例モードではない.(ps:構築方法に静的flagフラグ判断を追加し、一度しか作成できないことを保証できます)
「単一職責の原則」に反し、この種類は工場であり、製品でもある(自分で自分を作った).
単例モードは固定サイズの多例モードに改造することができる.
三、キャラクター
1つのロールだけが単一の例です.
四、Java例
いくつかのよく見られる実用的な例を挙げる
1.クラスのロード時にオブジェクトを生成する(例えば、この一例のオブジェクトを生成してリソースを消費しない場合、使用を考慮することができる)
利点:スレッドのセキュリティ;
欠点:(単一のインスタンスが最初に使用されたときに構築される)効果を達成できません.
2、一例のインスタンスは初めて使用される時に構築する(一スレッド環境で使用する)
利点:単一のインスタンスが最初に使用されたときに構築されます.
欠点:ロックをかけないと、スレッドの安全問題があり、ロックをかけても性能に影響を与える.
3、静的内部クラス(推奨使用)
利点:スレッドのセキュリティ;単一のインスタンスは、最初に使用されたときに構築されます.
短所:発見なし
テストクラスを次のように書きます.getInsanceメソッドを呼び出すと、単一のオブジェクトは生成されません.
印刷結果:
クラスにグローバルインスタンスが1つしかありません
二、補足説明
一般に、その構造方法をプライベートとし、そのインスタンスを取得できる静的方法を提供する.
Javaには反射メカニズムがあり、プライベート構造方法でも外部で作成できるため、一般的な書き方は厳密には単例モードではない.(ps:構築方法に静的flagフラグ判断を追加し、一度しか作成できないことを保証できます)
「単一職責の原則」に反し、この種類は工場であり、製品でもある(自分で自分を作った).
単例モードは固定サイズの多例モードに改造することができる.
三、キャラクター
1つのロールだけが単一の例です.
四、Java例
いくつかのよく見られる実用的な例を挙げる
1.クラスのロード時にオブジェクトを生成する(例えば、この一例のオブジェクトを生成してリソースを消費しない場合、使用を考慮することができる)
利点:スレッドのセキュリティ;
欠点:(単一のインスタンスが最初に使用されたときに構築される)効果を達成できません.
package com.pichen.dp.creationalpattern.singletonpattern.implement1;
public class MyPrinter {
private static MyPrinter myPrinter = new MyPrinter();
private MyPrinter(){
System.out.println("implements1: created a MyPrint instance.");
}
public static MyPrinter getInsatnce(){
return myPrinter;
}
public static void testPrint(){
MyPrinter.getInsatnce().print("hello!");
}
public void print(String str){
System.out.println(str);
}
}
2、一例のインスタンスは初めて使用される時に構築する(一スレッド環境で使用する)
利点:単一のインスタンスが最初に使用されたときに構築されます.
欠点:ロックをかけないと、スレッドの安全問題があり、ロックをかけても性能に影響を与える.
package com.pichen.dp.creationalpattern.singletonpattern.implement2;
public class MyPrinter {
private static MyPrinter myPrinter = null;
private MyPrinter(){
System.out.println("implements2: created a MyPrint instance.");
}
public static synchronized MyPrinter getInsatnce(){
if(null == myPrinter){
myPrinter = new MyPrinter();
}
return myPrinter;
}
public static void testPrint(){
System.out.println("hello!");
}
public void print(String str){
System.out.println(str);
}
}
3、静的内部クラス(推奨使用)
利点:スレッドのセキュリティ;単一のインスタンスは、最初に使用されたときに構築されます.
短所:発見なし
package com.pichen.dp.creationalpattern.singletonpattern.implement3;
public class MyPrinter {
private static class MyPrinterHolder {
private static MyPrinter instance = new MyPrinter();
}
private MyPrinter(){
System.out.println("implements3: created a MyPrint instance.");
}
public static MyPrinter getInsatnce(){
return MyPrinterHolder.instance;
}
public static void testPrint(){
System.out.println("hello!");
}
public void print(String str){
System.out.println(str);
}
}
テストクラスを次のように書きます.getInsanceメソッドを呼び出すと、単一のオブジェクトは生成されません.
package com.pichen.dp.creationalpattern.singletonpattern.implement3;
import com.pichen.dp.creationalpattern.singletonpattern.implement3.MyPrinter;
public class Main {
public static void main(String[] args) {
// MyPrinter p = MyPrinter.getInsatnce();
// p.print("hello world.");
MyPrinter.testPrint();
}
}
印刷結果:
hello!