亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式讀書筆記一 單例模式

2019-11-09 15:14:30
字體:
來源:轉載
供稿:網友

1、單例模式介紹 單例模式是應用最廣泛的模式之一,也是可以說是初級工程師唯一會用的設計模式。在應用這一模式的時候,單例對象的類必須保證只有一個實例存在。許多時候整個系統只要一個全局對象,這樣有利于我們協調系統整體行為。如在一個應用中,應該只有一個ImageLoader實例,這個ImageLoader中又包含有線程池、緩存系統、網絡請求等,很消耗資源,因此,沒有理由讓它有多個實例。這種情況就是單例模式的使用場景。 2、單例模式的定義 確保類只有一個實例,而且自行實例化并向整個系統提供這個實例 3、使用場景 確保類只有一個對象的場景 4、UML類圖 略 5、單例模式的多種實現 (1)餓漢模式 這是單例模式的最簡單的一種寫法,在具體介紹之前我們寫一個簡單的例子,這樣也方便后面介紹單例模式的其他寫發。 例如:一個公司只有一個CEO、幾個VP、無數個員工,例子很簡單。下面我們一點點的實現

普通員工類:Staff.java

package com.example.singleton;public class Staff { public void work() { //干活 }}

副總裁類:VP.java

package com.example.singleton;public class VP extends Staff { @Override public void work() { // TODO Auto-generated method stub super .work(); //管理下面的經理 }}

CEO類:CEO.java

package com.example.singleton;public class CEO extends Staff { PRivate static final CEO mCeo= new CEO(); // 構造函數私有化(構造方法的私有化是單例模式的核心) private CEO() { } /** * 方法一 * 餓漢單例模式 * * @author HP * */ public static CEO getCeo () { return mCeo ; } @Override public void work() { // TODO Auto-generated method stub super .work(); // 管理 vp }}

公司類:Company.java

package com.example.singleton;import java.util.ArrayList;import java.util.List;/** * 公司類 * @author HP * */public class Company { private List<Staff> allStaffs=new ArrayList<>(); public void addStaff(Staff per) { allStaffs.add(per); } public void showAllStaffs() { for(Staff per:allStaffs) { System.out.println("Obj:"+per.toString()); } }}

最后是Main.java

package com.example.singleton;public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Company cp = new Company(); //方法一 :餓漢模式 Staff ceo1 = CEO. getCeo(); Staff ceo2 = CEO. getCeo(); cp.addStaff(ceo1); cp.addStaff(ceo2); cp.showAllStaffs(); System. out .println("--------------------------------------" ); //測試發現有兩條數據是一樣的,說明單例類只能提供一個對象 Staff vp1= new VP(); Staff vp2= new VP(); Staff staff1= new Staff(); Staff staff2= new Staff(); Staff staff3= new Staff(); cp.addStaff(vp1); cp.addStaff(vp2); cp.addStaff(staff1); cp.addStaff(staff2); cp.addStaff(staff3); cp.showAllStaffs(); }}

輸出結果:

Obj:com.example.singleton.CEO@1cacd5d4Obj:com.example.singleton.CEO@1cacd5d4--------------------------------------Obj:com.example.singleton.CEO@1cacd5d4Obj:com.example.singleton.CEO@1cacd5d4Obj:com.example.singleton.VP@170a6001Obj:com.example.singleton.VP@2a24ed78Obj:com.example.singleton.Staff@5e6276e5Obj:com.example.singleton.Staff@126be4ccObj:com.example.singleton.Staff@697a1686

以上就是這個例子的全部內容,其中CEO.java就是一個單例類,因為之前說了一個公司就只有一個CEO。從代碼中可以看到,CEO類不能通過new關鍵字來構造對象,因為構造方法已經被私有化。只能通過CEO類對外開放的getCeo方法來獲取對象,而這個對象是在申明的時候就已經被初始化,這就保證的對象的唯一性。以上單例模式的寫法就是所謂的餓漢模式。 (2)懶漢模式 懶漢模式與餓漢模式的區別在于,懶漢模式的對象是在調用了getInstance方法的時候初始化的。懶漢模式的實現方式如下,將CEO類修改。

package com.example.singleton;public class CEO extends Staff { // private static final CEO mCeo=new CEO(); private static CEO mCeo; // 構造函數私有化(構造方法的私有化是單例模式的核心) private CEO() { } // /** // * 方法一 // * 餓漢單例模式 // * // * @author HP // * // */ // public static CEO getCeo() { // return mCeo; // } /** * 方法二 * 懶漢模式 * @return */ public static synchronized CEO getInstance() { if (mCeo != null) { mCeo = new CEO(); } return mCeo ; } @Override public void work() { // TODO Auto-generated method stub super .work(); // 管理 vp }}

對應的修改Main.java

package com.example.singleton;public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Company cp = new Company();// //方法一 :餓漢模式// Staff ceo1 = CEO.getCeo();// Staff ceo2 = CEO.getCeo(); //方法二:懶漢模式 Staff ceo1 = CEO. getInstance(); Staff ceo2 = CEO. getInstance(); cp.addStaff(ceo1); cp.addStaff(ceo2); cp.showAllStaffs(); System. out .println("--------------------------------------" ); //測試發現有兩條數據是一樣的,說明單例類只能提供一個對象 Staff vp1= new VP(); Staff vp2= new VP(); Staff staff1= new Staff(); Staff staff2= new Staff(); Staff staff3= new Staff(); cp.addStaff(vp1); cp.addStaff(vp2); cp.addStaff(staff1); cp.addStaff(staff2); cp.addStaff(staff3); cp.showAllStaffs(); }}

懶漢模式中的getInstance方法中添加了synchronized關鍵字,也就是說getInstance是一個同步方法,這就是在多線程情況下保證對象唯一性的手段。但是有一個問題,那就是即使mCeo已經被初始化,每次調用getInstance方法的時候還是會同步,這樣就造成了不必要的資源浪費。這也是懶漢模式的最大問題所在。

△ 懶漢模式的優缺點 懶漢模式的優點是單例只有使用的時候才會被初始化,在一定程度上節約了資源;缺點是第一次加載的時候反應稍慢,最大了問題是每次調用getInstance方法的時候都要同步,會造成不必要的開銷。

(3)DCL實現方式 這種方式既可以實現在需要的時候在初始化實例,又保證線程安全,并且在調用getInstance方法的時候不同不同,其實現如下:

package com.example.singleton;public class CEO extends Staff {// private static final CEO mCeo=new CEO(); private static CEO mCeo; // 構造函數私有化(構造方法的私有化是單例模式的核心) private CEO() { }// /**// * 方法一// * 餓漢單例模式// *// * @author HP// *// */// public static CEO getCeo() {// return mCeo;// }// /**// * 方法二// * 懶漢模式// * @return// */// public static synchronized CEO getInstance() {// if (mCeo == null) {// mCeo = new CEO();// }// return mCeo;// } /** * 方法三 * DCL */ public static CEO getInstance() { if (mCeo == null) { synchronized (CEO.class ) { if (mCeo == null) { mCeo =new CEO(); } } } return mCeo ; } @Override public void work() { // TODO Auto-generated method stub super .work(); // 管理 vp }}

這不是一種被推薦使用的單例模式寫法 (4)靜態內部類實現單例模式 其實現如下:

package com.example.singleton;public class CEO extends Staff { // private static final CEO mCeo=new CEO(); // private static CEO mCeo; // 構造函數私有化(構造方法的私有化是單例模式的核心) private CEO() { } // /** // * 方法一 // * 餓漢單例模式 // * // * @author HP // * // */ // public static CEO getCeo() { // return mCeo; // } // /** // * 方法二 // * 懶漢模式 // * @return // */ // public static synchronized CEO getInstance() { // if (mCeo == null) { // mCeo = new CEO(); // } // return mCeo; // } // /** // * 方法三 // * DCL // */ // public static CEO getInstance() { // if (mCeo==null) { // synchronized (CEO.class) { // if (mCeo==null) { // mCeo=new CEO(); // } // } // } // return mCeo; // } /** * 方法四 靜態內部類單例模式(推薦使用的單例模式) * * @return */ public static CEO getInstance() { return SinletonCEO. mCeo; } private static class SinletonCEO { private static final CEO mCeo = new CEO(); } @Override public void work() { // TODO Auto-generated method stub super .work(); // 管理 vp }}

當第一次加載CEO類的時候并不會初始化mCeo,只有在第一次調用CEO的getInstance方法的時候mCeo才會被初始化。因此,第一次調用getInstance方法會導致虛擬機加載SinletonCEO類,這種方式不僅能夠確保線程安全,同時也能夠保證單例對象的唯一性,同時也延遲了單例的實例化。所以這是一種推薦使用的單例實現方式。

(5)其他單例實現方式 其中還有兩種單例的實現方式,他們是枚舉單例和使用容器實現單例模式。這里就不再具體介紹了,想了解的同學可以翻閱《Android源碼設計模式解析與實戰》藝術。

6 總結 不管是哪種方式實現的單例模式,它們的核心就是構造函數的私有化,并且通過靜態方法來獲取一個唯一的實例,在這個過程中我們必須要保證線程安全、防止反序列化導致重生成實例等問題!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久久吃药| 欧美日韩国产一区二区| 中文字幕精品一区久久久久| 国产欧美精品一区二区三区-老狼| 亚洲影院在线看| 欧美性黄网官网| 国产精品视频一区国模私拍| 欧美视频在线观看免费| 国产69精品久久久久9999| 成人国产亚洲精品a区天堂华泰| 精品网站999www| 中文字幕日韩视频| 91在线精品视频| 国产成一区二区| 欧美超级免费视 在线| 日韩欧美亚洲成人| 91啪国产在线| 91精品久久久久久久久青青| 欧美激情第一页xxx| 亚洲人午夜色婷婷| 国产一区av在线| 亚洲欧美精品在线| 欧美成人全部免费| 91精品国产九九九久久久亚洲| 少妇精69xxtheporn| 精品久久国产精品| 欧美亚洲另类激情另类| 国产精自产拍久久久久久| 国产精品久久久精品| 亚洲理论片在线观看| 欧美又大粗又爽又黄大片视频| 精品久久香蕉国产线看观看gif| 久久精品这里热有精品| 成人黄色片在线| 91九色精品视频| 成人www视频在线观看| 国产精品视频精品| 国产在线精品自拍| 中文字幕久热精品视频在线| 亚洲一区二区三区乱码aⅴ| 日本中文字幕不卡免费| 国产亚洲福利一区| 国产精品久久久久久久久久| 亚洲欧美日本另类| 成人性生交大片免费看视频直播| 日日狠狠久久偷偷四色综合免费| 欧美又大又硬又粗bbbbb| 狠狠色噜噜狠狠狠狠97| 欧美日韩精品在线观看| 国产女人18毛片水18精品| 日韩va亚洲va欧洲va国产| 欧美日韩国产在线| 国产精品∨欧美精品v日韩精品| 亚洲视频网站在线观看| 久久夜精品va视频免费观看| 欧美电影在线观看网站| 国产91精品黑色丝袜高跟鞋| 国产91免费看片| 91wwwcom在线观看| 成人免费xxxxx在线观看| 日韩av电影手机在线| 在线观看不卡av| 国产成人中文字幕| 亚洲国产精品视频在线观看| 2021久久精品国产99国产精品| 久久国产精品99国产精| 亚洲国产精品小视频| 欧美理论电影在线观看| 亚洲精品小视频在线观看| 欧美激情综合色| 亚洲网在线观看| 日韩精品极品视频| 97精品久久久中文字幕免费| 日韩av在线电影网| 日韩有码在线观看| 亚洲加勒比久久88色综合| 久久精品国产一区二区电影| 欧美体内谢she精2性欧美| 日韩精品极品毛片系列视频| 久久婷婷国产麻豆91天堂| 亚洲淫片在线视频| 在线观看日韩欧美| 久久久精品国产网站| 国产精品亚发布| 久久成年人视频| 亚洲第一区中文99精品| 日韩暖暖在线视频| 亚洲精品不卡在线| 高清日韩电视剧大全免费播放在线观看| 亚洲а∨天堂久久精品9966| 日本成人在线视频网址| 精品久久久999| 韩国v欧美v日本v亚洲| 欧美日韩中文在线| 国产小视频国产精品| 久久久国产视频| 久久久久久久久中文字幕| 成人免费淫片aa视频免费| 成人有码视频在线播放| 欧美激情第一页xxx| 欧美日韩激情美女| 91精品国产综合久久男男| 欧美在线观看日本一区| 韩国一区二区电影| 亚洲精品一区二三区不卡| 日韩在线视频二区| 亚洲成人激情图| 国内外成人免费激情在线视频| 国产免费一区二区三区在线观看| 亚洲欧美国产制服动漫| 久久在线免费视频| 国产激情久久久久| 久久久噜噜噜久久中文字免| 俺去了亚洲欧美日韩| 亚洲成年人在线播放| 在线观看日韩欧美| 欧洲成人午夜免费大片| 精品亚洲精品福利线在观看| 欧美精品videos另类日本| 精品成人乱色一区二区| 一区二区中文字幕| 亚洲精品国产精品久久清纯直播| 亚洲美女视频网| 中文字幕欧美日韩精品| 一个色综合导航| 亚洲福利小视频| 91国自产精品中文字幕亚洲| 国色天香2019中文字幕在线观看| 成人免费看黄网站| 亚洲一区中文字幕在线观看| 日韩中文字幕免费视频| 久久久久久亚洲精品中文字幕| 国产精品久久久久久久久久小说| 亲子乱一区二区三区电影| 57pao成人国产永久免费| 一区二区三区久久精品| 色综合影院在线| 亚洲一区av在线播放| 欧美亚洲激情视频| 国产精品久久国产精品99gif| 欧美一级片免费在线| 日韩av电影免费观看高清| 欧美日韩中文在线| 中文字幕视频一区二区在线有码| 疯狂蹂躏欧美一区二区精品| 国产精品美女免费看| 亚洲欧美一区二区三区四区| 性视频1819p久久| 色久欧美在线视频观看| 欧美午夜视频一区二区| 国产精品中文字幕在线| 1769国内精品视频在线播放| 国产午夜精品全部视频在线播放| 久久精品福利视频| 欧美日韩一区免费| 亚洲成人黄色在线| 亚洲精品99999| 亚洲综合中文字幕在线观看| 57pao成人国产永久免费| 26uuu久久噜噜噜噜| 深夜福利91大全| 69av视频在线播放| 中文日韩在线视频| 日韩精品在线看|