一、單例模式 在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的一個類只有一個實例。即一個類只有一個對象實例。 二、分類 分為懶漢式和餓漢式兩種; 三、應用場景 1.需要頻繁實例化然後銷毀的對象。 2.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。 3.有 ...
一、單例模式
在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的一個類只有一個實例。即一個類只有一個對象實例。
二、分類
分為懶漢式和餓漢式兩種;
三、應用場景
1.需要頻繁實例化然後銷毀的對象。
2.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。
3.有狀態的工具類對象。
4.頻繁訪問資料庫或文件的對象。
四:代碼實現
1.餓漢式
public class Person { /* 1.用final修飾,保證引用不可改變,保證唯一性; 2.餓漢式優缺點 優點 (1)線程安全 (2)在類載入的同時已經創建好一個靜態對象,調用時反應速度快 缺點 資源效率不高,可能getInstance()永遠不會執行到, 但執行該類的其他靜態方法或者載入了該類(class.forName),那麼這個實例仍然初始化 */ public static final Person person = new Person(); private String name; /** * 單例模式構造函數要私有化,防止外部創建 */ private Person() { } public static Person getInstance() { return person; } }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
添加測試方法
public class SingletonTest { public static void main( String[] args ) { Person person1 = Person.getInstance(); Person person2 = Person.getInstance(); Person person3 = Person.getInstance(); Person person4 = Person.getInstance(); person1.setName("zhang"); person2.setName("wang"); person3.setName("li"); person4.setName("zhao"); System.out.println(person1.getName()); System.out.println(person2.getName()); System.out.println(person3.getName()); System.out.println(person4.getName()); } }
輸出:
Connected to the target VM, address: '127.0.0.1:52622', transport: 'socket' zhao zhao zhao zhao Disconnected from the target VM, address: '127.0.0.1:52622', transport: 'socket' Process finished with exit code 0
2.懶漢式
public class LazyPerson { private static LazyPerson lazyPerson; private String name; /** * 構造函數私有化 */ private LazyPerson(){ } /** * 優點: * 避免了餓漢式的那種在沒有用到的情況下創建事例,資源利用率高,不執行getInstance()就不會被實例,可以執行該類的其他靜態方法。 * 缺點: * 第一次載入時反應不快,由於java記憶體模型一些原因偶爾失敗 * @return */ public static LazyPerson getInstance(){ if(lazyPerson==null){ //鎖住對象 synchronized (LazyPerson.class){ if (lazyPerson==null){ lazyPerson=new LazyPerson(); } } } return lazyPerson; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
測試方法
public class SingletonTest { public static void main( String[] args ) { // Person person1 = Person.getInstance(); // Person person2 = Person.getInstance(); // Person person3 = Person.getInstance(); // Person person4 = Person.getInstance(); LazyPerson person1 = LazyPerson.getInstance(); LazyPerson person2 = LazyPerson.getInstance(); LazyPerson person3 = LazyPerson.getInstance(); LazyPerson person4 = LazyPerson.getInstance(); person1.setName("zhang"); person2.setName("wang"); person3.setName("li"); person4.setName("zhao"); System.out.println(person1.getName()); System.out.println(person2.getName()); System.out.println(person3.getName()); System.out.println(person4.getName()); } }
執行結果
Connected to the target VM, address: '127.0.0.1:53066', transport: 'socket' Disconnected from the target VM, address: '127.0.0.1:53066', transport: 'socket' zhao zhao zhao zhao Process finished with exit code 0