設計模式單例

單例模式

設計原則:無
常用場景:應用中有對象需要是全局的且唯一
使用概率:99.99999%
復雜度:低
變化點:無
選擇關鍵點:一個對象在應用中出現多個實例是否會引起邏輯上或者是程序上的錯誤
逆鱗:在以為是單例的情況下,卻產生了多個實例
相關設計模式
原型模式:單例模式是只有一個實例,原型模式每拷貝一次都會創造一個新的實例。



常用場景:
1.需要頻繁實例化然后銷毀的對象。
2.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。
3.有狀態的工具類對象。
4.頻繁訪問數據庫或文件的對象。
以下都是單例模式的經典使用場景:
1.資源共享的情況下,避免由于資源操作時導致的性能或損耗等。如上述中的日志文件,應用配置。
2.控制資源的情況下,方便資源之間的互相通信。如線程池等。


優點:
1.在單例模式中,活動的單例只有一個實例,對單例類的所有實例化得到的都是相同的一個實例。這樣就 防止其它對象對自己的實例化,確保所有的對象都訪問一個實例
2.單例模式具有一定的伸縮性,類自己來控制實例化進程,類就在改變實例化進程上有相應的伸縮性。
3.提供了對唯一實例的受控訪問。
4.由于在系統內存中只存在一個對象,因此可以 節約系統資源,當 需要頻繁創建和銷毀的對象時單例模式無疑可以提高系統的性能。
5.允許可變數目的實例。
6.避免對共享資源的多重占用。
缺點:
1.不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發生變化,單例就會引起數據的錯誤,不能保存彼此的狀態。
2.由于單利模式中沒有抽象層,因此單例類的擴展有很大的困難。
3.單例類的職責過重,在一定程度上違背了“單一職責原則”。
4.濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失。



基本思想
1.在類中實例化一個私有對象
2.構造方法私有化
3.提供一個靜態方法返回實例化的對象


現有的一些單例模式區別主要在
1.類加載時 直接進行對象初始化 增大項目啟動時系統開銷
類加載時不初始化 在方法中判斷空 進行初始化
2.并發
直接初始化 不存在并發、產生多對象、非單例問題
使用時初始化 要考慮 初始化方式 防止并發可能產生 多實例問題


在實際使用場景中,不推薦使用直接初始化的方式。


public class Singleton {private Singleton() {}/*//最基本方式  但是會引起并發創建多實例問題  一定不能用private static Singleton singleton;public static Singleton getInstance() {if (singleton==null) {singleton = new Singleton();}return singleton;}*//*//直接方法同步  不會存在并發多實例問題  但設計很糟糕在獲取實例時會產生等待  不推薦private static Singleton singleton;public synchronized static Singleton getInstance() {if (singleton==null) {singleton = new Singleton();}return singleton;}*//*//雙重加鎖  使用類實例進行加鎖//只是看起來好很多,在Java指令中創建對象和賦值操作是分開進行的,也就是說instance = new Singleton();// 語句是分兩步執行的。但是JVM并不保證這兩個操作的先后順序,也就是說有可能JVM會為新的Singleton實例分配空間,// 然后直接賦值給instance成員,然后再去初始化這個Singleton實例。這樣就可能出錯了private static Singleton singleton;public static Singleton getInstance() {if (singleton==null) {synchronized (Singleton.class) {if (singleton==null) {singleton = new Singleton();}}}return singleton;}*///終極模式 使用內部類//主要依據static 只會在jvm加載類時初始化一次,即內部類中 instance 由jvm保證了只初始化一次private static class SingletonFactory {private static Singleton instance = new Singleton();}public static Singleton getInstance() {return SingletonFactory.instance;}}

?



轉載于:https://www.cnblogs.com/zhaojj/p/7763015.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540402.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540402.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540402.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Squid服務日志分析

Squid服務日志分析 Apache 和 Squid 是兩種著名的代理緩存軟件,但Squid 較 Apache 而言是專門的代理緩存服務器軟件,其代理緩存的功能強大,支持 HTTP/1.1 協議,其緩存對象也較多;并且 Squid 的緩存管理模塊和訪問控制模…

[轉載] Java中的元數據

參考鏈接: Java中的數據類型 元數據 也可能剛聽到元數據你會有點陌生,其實任何一個使用過struts,ejb或者hibernate的開發人員都在不知不覺中使用元數據。所謂的元數據是指用來描述數據的數據,更通俗一點就是描述代碼間關系&#…

云時代 揭開性能監測戰略的隱秘優勢

云時代的性能監測戰略 能夠對各種變化做出快速響應而不偏離重心和企業發展動力,正逐漸成為各行各業、各種規模企業的奮斗目標。業務敏捷性通常是運營良好,可實現盈利的企業標志。實現這一目標意味著公司已經成功地利用業務關鍵型技術來提高生產率&#x…

[轉載] java 枚舉Enum源碼解析

參考鏈接: 使用Java枚舉 應用場景 枚舉是單例模式中的一種。面試官系統之設計模式(單例模式) 簡單來講就是只能實例化一次,線程安全且性能高。枚舉通常用來列舉一個類型的有限實例集合,我們可以使用常量集來實現&…

聊聊全站HTTPS帶來的技術挑戰

日前寫的文章里了討論了數據傳輸的安全性的問題,最后一部分提到了通過HTTPS解決數據傳輸安全性的方案。那么一個新問題又來了,實施全站HTTPS的過程中,我們可能會遇到哪些技術問題?所以我今天和大家一起來算一下這個賬,將技術成本…

[轉載] spring mvc自定義int枚舉轉換器

參考鏈接&#xff1a; Java中具有自定義值的枚舉 2019獨角獸企業重金招聘Python工程師標準>>> public class MyIntegerEnumConverters { WritingConverter public static class EnumToIntegerConverter implements Converter<IntEnumConvertable, String> {…

使用BufferedImage進行漸變色操作

序 本文主要簡述一下如何使用BufferedImage進行漸變色操作。 GradientPaint java/awt/GradientPaint.java public class GradientPaint implements Paint {Point2D.Float p1;Point2D.Float p2;Color color1;Color color2;boolean cyclic;//...... } 這個是生成漸變色的關…

[轉載] Java中的字符串處理

參考鏈接&#xff1a; Java中的StringBuffer appendCodePoint()方法以及示例 JDK8在線Api中文手冊 JDK8在線Api英文手冊 Java中的字符串處理 1.1 String類的構造函數1.2 字符串的長度1.3 特殊的字符串操作1.3.1 字符串字面值1.3.2 字符串連接1.3.3 字符串和其他數據類型的連…

MySQL循環語句之while循環測試

轉自&#xff1a;http://www.nuoweb.com/database/7614.htmlMySQL有循環語句操作&#xff0c;while 循環、loop循環和repeat循環&#xff0c;目前我只測試了 while 循環&#xff0c;下面與大家分享下mysql 操作同樣有循環語句操作&#xff0c;網上說有3中標準的循環方式&#x…

[轉載] JAVA環境變量配置

參考鏈接&#xff1a; Java中的變量 安裝JDK(1.8) Oracle官網 下載jdk 百度網盤window版本 提取碼&#xff1a;o99i win 10環境變量配置 在電腦桌面 右鍵點擊 此電腦 的 屬性 選項 選擇 高級系統設置 > 然后點擊 環境變量 選項 點擊 系統變量 下的 新建 按鈕&#xf…

[轉載] Java中的變量和常量

參考鏈接&#xff1a; Java中的變量范圍 在程序中存在大量的數據來代表程序的狀態&#xff0c;其中有些數據在程序的運行過程中值會發生改變&#xff0c;有些數據在程序運行過程中值不能發生改變&#xff0c;這些數據在程序中分別被叫做變量和常量。 在實際的程序中&#xf…

4.3/4.4 磁盤分區

2019獨角獸企業重金招聘Python工程師標準>>> 添加虛擬磁盤 第一步&#xff0c;選擇虛擬機中的“設置” 第二步&#xff0c;選擇“添加硬盤” 第三步&#xff0c;選擇_SCSI &#xff08;推薦&#xff09; # 保持默認 第四步&#xff0c;選擇“創建新的虛擬磁盤…

[轉載] java(三)對象的序列化與static、final關鍵字

參考鏈接&#xff1a; Java中的final最終變量 java對象的序列化 Java序列化是指把Java對象轉換為字節序列的過程&#xff1b;而Java反序列化是指把字節序列恢復為Java對象的過程。java中存有Cloneable接口&#xff0c;實現此接口的類都具有被拷貝能力&#xff0c;比new一個對象…

RoboMaster 2017:機器人版的「王者農藥」,工程師們的競技時代

8月6日晚&#xff0c;第十六屆全國大學生機器人大賽 RoboMaster 2017機甲大師賽在華潤深圳灣體育中心“春繭”體育館舉行&#xff0c;關于這個比賽的盛況已經無需贅述&#xff0c;去年雷鋒網參加上屆比賽時&#xff0c;報道的是「像看了一場演唱會」&#xff0c;如果用演唱會來…

[轉載] 詳解Java中的泛型

參考鏈接&#xff1a; Java中具有泛型的有界類型 1、什么是泛型 泛型&#xff0c;即“參數化類型”。一提到參數&#xff0c;最熟悉的就是定義方法時有形參&#xff0c;然后調用此方法時傳遞實參。那么參數化類型怎么理解呢&#xff1f;顧名思義&#xff0c;就是將類型由原來…

【初學者必讀】:前端工程師的知識體系

下圖是前端工程師圖解&#xff1a; 前端開發的核心是HTML CSS JavaScript。本質上它們構成一個MVC框架&#xff0c;即HTML作為信息模型&#xff08;Model&#xff09;&#xff0c;CSS控制樣式&#xff08;View&#xff09;&#xff0c;JavaScript負責調度數據和實現某種展現邏…

[轉載] Java面試題大全(2020版)

參考鏈接&#xff1a; Java中的循環 發現網上很多Java面試題都沒有答案&#xff0c;所以花了很長時間搜集整理出來了這套Java面試題大全&#xff0c;希望對大家有幫助哈~ 本套Java面試題大全&#xff0c;全的不能再全&#xff0c;哈哈~ 博主已將以下這些面試題整理成了一個…

使用Prometheus監控Cloudflare的全球網絡

Matt Bostock在SRECON 2017歐洲大會的演講中&#xff0c;介紹了如何使用Prometheus實現對CloudFlare分布于全球的架構和網絡的監控。Prometheus是一種基于度量進行監控的工具&#xff0c;CloudFlare是一家CDN、DNS和DDoS防御&#xff08;Mitigation&#xff09;服務提供商。\\基…

[轉載] Java-forEach增強for循環是值傳遞規則詳解

參考鏈接&#xff1a; Java中的for-each循環 1. 引入 正如Java語法意義&#xff0c;變量的傳遞只有值傳遞&#xff0c;雖然變量分為引用變量和基本類型變量&#xff0c;前者更像C中的地址概念。 在學習Lambda表達式的時候&#xff0c;遇到了試圖在增強for循環中對原鏈表元素重…

開始吧

2019獨角獸企業重金招聘Python工程師標準>>> 寫C三年有余&#xff0c;在技術方面也算小有所成。準備在這里分享一些C進階、Python、Golang技術文章。 CSDN博客地址&#xff1a; http://blog.csdn.net/godmaycry 以后博客同步更新。 轉載于:https://my.oschina.net/u…