Java基礎-單例設計模式之懶漢式
阿新 • • 發佈:2022-03-03
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; } }