Java單例模式
概念:
java中單例模式是一種常見的設計模式,單例模式分三種:懶漢模式單例、餓漢模式單例、登記模式的那裡三種。
單例模式有一下特點:
1、單例類只能有一個執行個體。
2、單例類必須自己自己建立自己的唯一執行個體。
3、單例類必須給所有其他對象提供這一執行個體。
單例模式確保某個類只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體。
1.餓漢式單例類
1 //餓漢式單例類.在類初始化時,已經自行執行個體化 2 public class Singleton1 { 3 //私人的預設構造子 4 private Singleton1() {} 5 //已經自行執行個體化 6 private static final Singleton1 single = new Singleton1(); 7 //靜態Factory 方法 8 public static Singleton1 getInstance() { 9 return single;10 }11 }
2.懶漢式單例類
1 //懶漢式單例類.在第一次調用的時候執行個體化 2 public class Singleton2 { 3 //私人的預設構造子 4 private Singleton2() {} 5 //注意,這裡沒有final 6 private static Singleton2 single=null; 7 //靜態Factory 方法 8 public synchronized static Singleton2 getInstance() { 9 if (single == null) { 10 single = new Singleton2();11 } 12 return single;13 }14 }
3.登記式單例類
1 import java.util.HashMap; 2 import java.util.Map; 3 //登記式單例類. 4 //類似Spring裡面的方法,將類名註冊,下次從裡面直接擷取。 5 public class Singleton3 { 6 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>(); 7 static{ 8 Singleton3 single = new Singleton3(); 9 map.put(single.getClass().getName(), single);10 }11 //保護的預設構造子12 protected Singleton3(){}13 //靜態Factory 方法,返還此類惟一的執行個體14 public static Singleton3 getInstance(String name) {15 if(name == null) {16 name = Singleton3.class.getName();17 System.out.println("name == null"+"--->name="+name);18 }19 if(map.get(name) == null) {20 try {21 map.put(name, (Singleton3) Class.forName(name).newInstance());22 } catch (InstantiationException e) {23 e.printStackTrace();24 } catch (IllegalAccessException e) {25 e.printStackTrace();26 } catch (ClassNotFoundException e) {27 e.printStackTrace();28 }29 }30 return map.get(name);31 }32 //一個示意性的商業方法33 public String about() { 34 return "Hello, I am RegSingleton."; 35 } 36 public static void main(String[] args) {37 Singleton3 single3 = Singleton3.getInstance(null);38 System.out.println(single3.about());39 }40 }