<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
【JAVA長虹鍵法】 主要講了23種設計模式,本系列專欄會以虹貓藍兔七俠傳的故事為例來給大家詳細分析所有模式,希望能給大家帶來幫助!
模式: 單例模式
案例: 虹貓藍兔造劍
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種存取其唯一的物件的方式,可以直接存取,不需要範例化該類的物件。
注意:
1、單例類只能有一個範例。
2、單例類必須自己建立自己的唯一範例。
3、單例類必須給所有其他物件提供這一範例。
單例模式大致分為懶漢式和餓漢式,接下來用案例分析
是否 Lazy 初始化: 是
是否多執行緒安全:否
實現難度: 易
描述: 這種方式是最基本的實現方式,這種實現最大的問題就是不支援多執行緒。因為沒有加鎖 synchronized,所以嚴格意義上它並不算單例模式。
這種方式 lazy loading 很明顯,不要求執行緒安全,在多執行緒不能正常工作。
概念看不懂沒關係,接下來舉例。
案例一:
建立一個劍類,這個類可以範例化一把劍。
虹貓和藍兔兩個人都想要造一把劍,虹貓先打造了一把劍,命名為長虹劍,然後藍兔也打造了一把劍,但是沒有命名。
現在來分析兩個情況,一個情況是正常模式,另一種情況是單例模式。
劍類:
public class Jians { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
測試類:
public class Demo1 { public static void main(String[] args) { //虹貓的劍 Jians hong = new Jians(); //藍兔的劍 Jians lan = new Jians(); hong.setName("長虹劍"); System.out.println(hong.getName()); System.out.println(lan.getName()); } }
結果:
在正常模式下,我new了虹貓和藍兔的劍。其實就是兩把劍,兩個不同的物件。
劍類:
劍類中的getInstance()方法有一個造劍的功能,也就是new一個劍物件的功能。
public class Jian { private static Jian jian; private String name; public static Jian getInstance() { if (jian == null) { jian = new Jian(); } return jian; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
測試類:
public class Demo { public static void main(String[] args) { //虹貓的劍 Jian hong = Jian.getInstance(); //藍兔的劍 Jian lan = Jian.getInstance(); //虹貓把劍命名長虹劍 hong.setName("長虹劍"); //輸出 System.out.println(hong.getName()); System.out.println(lan.getName()); } }
結果:
在單例模式下,我new了虹貓和藍兔的劍。其實就是一把劍,一個相同的物件。
單例模式下的劍類:
public class Jian { private static Jian jian; private String name; public static Jian getInstance() { if (jian == null) { jian = new Jian(); } return jian; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
就拿這個類來說,他是執行緒不安全的。因為他通過getInstance()方法來獲取物件。如果是多執行緒執行,有執行緒1和執行緒2都先後進入了這個方法,因為執行緒1剛進入方法還沒有返回物件,執行緒2就進入了方法。所以執行緒2也會new一個物件,因為此時執行緒2進入方法的時候jian還是null的。
是否 Lazy 初始化: 是
是否多執行緒安全: 是
實現難度: 易
描述: 這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情況下不需要同步。
優點: 第一次呼叫才初始化,避免記憶體浪費。
缺點: 必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。
這裡還用上面那個案例,這次主要介紹懶漢式一和懶漢式二的區別。
懶漢式一和懶漢式二的主要區別在劍類上。
懶漢式一的劍類:
public class Jian { private static Jian jian; private String name; public static Jian getInstance() { if (jian == null) { jian = new Jian(); } return jian; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
懶漢式二的劍類:
public class Jian { private static Jian jian; private String name; public static synchronized Jian getInstance() { if (jian == null) { jian = new Jian(); } return jian; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
在getInstance()方法前加了個欄位synchronized,synchronized是一把鎖,作用是同一時間只能有一個執行緒進入這個方法,這樣就避免了懶漢式一中兩個執行緒都進入方法的情況出現,就不會new兩個物件,所以執行緒安全。
是否 Lazy 初始化: 否
是否多執行緒安全: 是
實現難度: 易
描述: 這種方式比較常用,但容易產生垃圾物件。
優點: 沒有加鎖,執行效率會提高。
缺點: 類載入時就初始化,浪費記憶體。
餓漢式就是直接在類中new一個物件,就是不管你需不需要劍我已經把劍造好了。
餓漢式劍類:
public class Jian { private static Jian jian=new Jian(); private String name; public static synchronized Jian getInstance() { return jian; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
測試類:
public class Demo { public static void main(String[] args) { //虹貓的劍 Jian hong = Jian.getInstance(); //藍兔的劍 Jian lan = Jian.getInstance(); //虹貓把劍命名長虹劍 hong.setName("長虹劍"); //輸出 System.out.println(hong.getName()); System.out.println(lan.getName()); } }
餓漢式中劍類的getInstance()方法已經失去了造劍的功能,測試類呼叫它只是返回一把提前造好的劍
還是這個案例,虹貓和藍兔都想造一把劍,懶漢式是有一個劍類,劍類中有一個造劍的方法,呼叫這個方法的時候打造一把劍。餓漢式也有一個劍類,不同的是這個劍類直接就把劍造好了,沒有造劍的方法,不管你虹貓和藍兔想不想造劍,劍都已經造好了。
優點: 沒有加鎖,執行效率會提高。
缺點: 類載入時就初始化,浪費記憶體。
現在在看餓漢式的優缺點就容易理解了。
下期預告
模式: 簡單工廠模式
案例: 虹貓藍兔莎莉找鑄劍師造劍
到此這篇關於Java 設計模式以虹貓藍兔的故事講解單例模式的文章就介紹到這了,更多相關Java 單例模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45