java單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。
基本介紹
- 中文名:java單例模式
- 外文名:java Singleton pattern
- 分類:懶漢式、餓漢式、登記式單例
- 特點:只能有一個實例等
- 使用目的:避免不一致狀態,避免政出多頭
1、單例類只能有一個實例。
2、單例類必須自己創建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。
單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。在計算機系統中,執行緒池、快取、日誌對象、對話框、印表機、顯示卡的驅動程式對象常被設計成單例。這些套用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干通信連線埠,系統應當集中管理這些通信連線埠,以避免一個通信連線埠同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。
- public class Singleton{
- private static Singleton unique Instance=null;
- private Singleton(){
- //Exists only to defeat instantiation.
- }
- public static Singleton getInstance(){
- if(unique Instance==null){
- unique Instance=new Singleton();
- }
- return unique Instance;
- }
- //Other methods...
- }
- package jason.single;
- public class TestStream{
- Stringname=null;
- public String getName(){
- return name;
- }
- public void setName(Stringname){
- this.name=name;
- }
- private Test Stream(){
- }
- private static TestStreamts1=null;
- public static TestStream getTest(){
- if(ts1==null){
- ts1=new TestStream();
- }
- returnts 1;
- }
- public void printInfo(){
- System.out.println("the name is"+name);
- }
- }
- package jason.single;
- public class TMain{
- public static void main(String[]args){
- Test Streamts1=TestStream.getTest();
- ts1.setName("jason");
- TestStreamts2=TestStream.getTest();
- ts2.setName("0539");
- ts1.printInfo();
- ts2.printInfo();
- if(ts1==ts2){
- System.out.println("創建的是同一個實例");
- }else{
- System.out.println("創建的不是同一個實例");
- }
- }
- }
- //餓漢式單例類.在類初始化時,已經自行實例化
- public class Singleton1{
- //私有的默認構造子
- private Singleton1(){}
- //已經自行實例化
- private static final Singleton1 single=new Singleton1();
- //靜態工廠方法
- public static Singleton1 getInstance(){
- return single;
- }
- }
2.懶漢式單例類
- import java.util.HashMap;
- import java.util.Map;
- //登記式單例類.
- //類似Spring裡面的方法,將類名註冊,下次從裡面直接獲取。
- public class Singleton3{
- private static Map<String,Singleton3>map=new HashMap<String,Singleton3>();
- Singleton3 single=new Singleton3();
- map.put(single.getClass().getName(),single);
- }
- //保護的默認構造子
- protected Singleton3(){}
- //靜態工廠方法,返還此類惟一的實例
- public static Singleton3 getInstance(Stringname){
- if(name==null){
- name=Singleton3.class.getName();
- System.out.println("name==null"+"--->name="+name);
- }
- if(map.get(name)==null){
- try{
- map.put(name,(Singleton3)Class.forName(name).newInstance());
- }catch(InstantiationExceptione){
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- e.printStackTrace();
- }catch(ClassNotFoundExceptione){
- e.printStackTrace();
- }
- }
- returnmap.get(name);
- }
- //一個示意性的商業方法
- public String about(){
- return"Hello,IamRegSingleton.";
- }
- public static void main(String[]args){
- Singleton3 single3=Singleton3.getInstance(null);
- System.out.println(single3.about());
- }
- }