シングルモード★★★★☆

4620 ワード

一、単例モードとは何か
クラスにグローバルインスタンスが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!