1. 程式人生 > 其它 >Java基礎-單例設計模式之懶漢式

Java基礎-單例設計模式之懶漢式

package com.hspedu.single_;


public class SingleTon02 {
    public static void main(String[] args) {
        // 單例模式 - 懶漢式

        /*
         * 餓漢式和懶漢式的區別:
         *   餓漢式建立了,但不一定會使用;懶漢式只有使用了,才會去建立這個物件
         *   二者建立物件的時機是不同的
         *   餓漢式不存線上程安全問題,懶漢式會存線上程安全問題
         *      (如果有多個執行緒同時進入getInstance時,會出現建立多個例項,只是保留最後建立的物件)
         *   餓漢式可能會造成資源浪費,懶漢式不存在這個問題
         *
         * 
*/ // Cat cat = new Cat("大黃"); // 載入了這個類,但是沒有建立物件 System.out.println(Cat.n1); Cat instance = Cat.getInstance(); System.out.println(instance); Cat instance2 = Cat.getInstance(); System.out.println(instance2); System.out.println(instance == instance2);
// Runtime是經典的餓漢式的單例模式 } } class Cat { private String name; public static int n1 = 999; private static Cat cat; // 預設是null,或者給定一個null /* * 1、構造器私有化 * 2、定義一個靜態屬性物件 * 3、提供一個public公共的static靜態方法,返回一個CAT物件 * * 只有當使用了getInstance才會返回一個物件,後面再次呼叫會返回之前的物件,保證單例 *
*/ private Cat(String name) { System.out.println("Cat構造器被呼叫"); this.name = name; } public static Cat getInstance() { if (cat == null) { cat = new Cat("小可愛"); } return cat; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + '}'; } }
package com.hspedu.singleton_;

public class SingleTonPattern {
    public static void main(String[] args) {
        // 練習懶漢式單例設計模式

        /*
        * 1、構造器私有化private
        * 2、提供一個靜態屬性物件(與餓漢式不同此處為null)
        * 3、提供一個靜態方法返回這個物件
        * */
        System.out.println(Dog.legs);

        Dog dog1 = Dog.getDog();
        Dog dog2 = Dog.getDog();
        Dog dog3 = Dog.getDog();
        System.out.println(Dog.getDog().getName());
        System.out.println(dog1.getName());
        System.out.println(dog2 == dog3);
    }
}

class Dog {

    private String name;

    private int age;

    public static int legs = 4;

    private static Dog dog = null;

    private Dog(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("呼叫Dog類構造器建立了一隻狗");
    }

    public static Dog getDog() {
        if (dog == null) {
            dog = new Dog("小白", 5);
        }
        return dog;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}