java 3种单例模式
生活随笔
收集整理的這篇文章主要介紹了
java 3种单例模式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.餓漢式
1 package singleInstance; 2 /**餓漢式,類加載時(shí)候創(chuàng)建實(shí)例,浪費(fèi)資源,線程是安全的*/ 3 public class SingleDome01 { 4 //私有構(gòu)造方法,防止直接new對(duì)象 5 private SingleDome01() { 6 } 7 //類加載的時(shí)候,創(chuàng)建對(duì)象 8 private static SingleDome01 instance = new SingleDome01(); 9 //提供getter,方便外界訪問私有對(duì)象 10 public static SingleDome01 getInstance() { 11 return instance; 12 } 13 }2.懶漢式
1 package singleInstance; 2 /**懶漢式,被調(diào)用時(shí)候才會(huì)實(shí)例化,節(jié)約資源,高并發(fā)線程時(shí)不安全*/ 3 public class SingleDome02 { 4 //私有構(gòu)造方法,防止直接new對(duì)象 5 private SingleDome02(){ 6 } 7 private static SingleDome02 instance; 8 //提供getter,以便外界調(diào)用私有對(duì)象,返回SingleDome02對(duì)象 9 public static SingleDome02 getInstance() { 10 if(instance==null){ 11 instance = new SingleDome02(); 12 } 13 return instance; 14 } 15 }?3.餓漢式與懶漢式改良
1 package singleInstance; 2 /**采用內(nèi)部類實(shí)例化對(duì)象,在調(diào)用時(shí)候才會(huì)加載,節(jié)約資源,還能保證線程是安全的*/ 3 public class SingleDome03 { 4 //私有構(gòu)造方法,防止直接new對(duì)象 5 private SingleDome03() { 6 } 7 //靜態(tài)內(nèi)部類只有在調(diào)用時(shí)候才會(huì)加載 8 private static class InnerSingleDome03{ 9 private static SingleDome03 instance = new SingleDome03(); 10 } 11 public static SingleDome03 getInstance(){ 12 return InnerSingleDome03.instance; 13 } 14 }?4.登記式
1 package singleInstance; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 /**采用spring的用法,利用反射創(chuàng)建對(duì)象,講實(shí)例注冊(cè)到map里面,下次用的時(shí)候直接取*/ 7 public class SingleDome04 { 8 //私有構(gòu)造方法,防止外部直接new對(duì)象 9 private SingleDome04() { 10 } 11 private static Map<String,SingleDome04> map = new HashMap<String,SingleDome04>(); 12 //靜態(tài)代碼塊,類加載時(shí)候?qū)嵗瘜?duì)象和map,并將對(duì)象放入map里 13 static{ 14 SingleDome04 instance = new SingleDome04(); 15 map.put(instance.getClass().getName(), instance); 16 } 17 public static SingleDome04 getInstance(String name){ 18 if(name==null){ 19 name="singleInstance.SingleDome04"; 20 } 21 if(!map.containsKey(name)){ 22 try { 23 map.put(name, (SingleDome04)Class.forName(name).newInstance()); 24 } catch (InstantiationException e) { 25 e.printStackTrace(); 26 } catch (IllegalAccessException e) { 27 e.printStackTrace(); 28 } catch (ClassNotFoundException e) { 29 e.printStackTrace(); 30 } 31 } 32 return map.get(name); 33 } 34 }最后測(cè)試代碼:
1 package singleInstance; 2 3 public class TestSingle { 4 public static void main(String[] args) { 5 SingleDome01 s1 = SingleDome01.getInstance(); 6 SingleDome01 s2 = SingleDome01.getInstance(); 7 if(s1==s2){ 8 System.out.println("s1=s2"); 9 }else{ 10 System.out.println("s1!=s2"); 11 } 12 SingleDome02 s3 = SingleDome02.getInstance(); 13 SingleDome02 s4 = SingleDome02.getInstance(); 14 if(s3==s4){ 15 System.out.println("s3=s4"); 16 }else{ 17 System.out.println("s3!=s4"); 18 } 19 SingleDome03 s5 = SingleDome03.getInstance(); 20 SingleDome03 s6 = SingleDome03.getInstance(); 21 if(s5==s6){ 22 System.out.println("s5=s6"); 23 }else{ 24 System.out.println("s5!=s6"); 25 } 26 SingleDome04 s7 = SingleDome04.getInstance("singleInstance.SingleDome04"); 27 SingleDome04 s8 = SingleDome04.getInstance("singleInstance.SingleDome04"); 28 if(s7==s8){ 29 System.out.println("s7=s8"); 30 }else{ 31 System.out.println("s7!=s8"); 32 } 33 } 34 }?
轉(zhuǎn)載于:https://www.cnblogs.com/miyin/p/3963316.html
總結(jié)
以上是生活随笔為你收集整理的java 3种单例模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS获取浏览器信息及屏幕分辨率
- 下一篇: 3DMM配置