設計模式之單例模式【程序設計模式是什么 程序設計模式作用】
本文開始整個設計模式的系列學習,希望通過不斷的學習,可以對設計模式有整體的掌握,并在項目中根據實際的情況加以利用 。
單例模式是指一個類僅允許創建其自身的一個實例,并提供對該實例的訪問權限 。它包含靜態變量,可以容納其自身的唯一和私有實例 。它被應用于這種場景——用戶希望類的實例被約束為一個對象 。在需要單個對象來協調整個系統時,它會很有幫助 。
1、單例類只能有一個實例
2、單例類必須自己創建自己的唯一實例
3、單例類必須給其他所有對象提供這一實例
1.盡量使用懶加載
2.雙重檢索實現線程安全
3.構造方法為private
4.定義靜態的Singleton instance對象和getInstance()方法
單例模式至少有六種寫法 。
作為一種重要的設計模式,單例模式的好處有:
1、控制資源的使用,通過線程同步來控制資源的并發訪問
2、控制實例的產生,以達到節約資源的目的
3、控制數據的共享,在不建立直接關聯的條件下,讓多個不相關的進程或線程之間實現通信
Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問 。但其實通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效 。
雖然也是只有一個線程能夠執行,假如線程B先執行,線程B獲得鎖,線程B執行完之后,線程 A獲得鎖,但是此時沒有檢查singleton是否為空就直接執行了,所以還會出現兩個singleton實例的情況 。
既然懶漢式是非線程安全的,那就要改進它 。最直接的想法是,給getInstance方法加鎖不就好了,但是我們不需要給方法全部加鎖啊,只需要給方法的一部分加鎖就好了 。基于這個考慮,引入了雙檢鎖(Double Check Lock,簡稱DCL)的寫法:
使用volatile 的原因:
對于JVM而言,它執行的是一個個Java指令 。在Java指令中創建對象和賦值操作是分開進行的,也就是說instance = new Singleton();語句是分兩步執行的 。但是JVM并不保證這兩個操作的先后順序,也就是說有可能JVM會為新的Singleton實例分配空間, 然后直接賦值給instance成員,然后再去初始化這個Singleton實例 。這樣就使出錯成為了可能,我們仍然以A、B兩個線程為例:
加載一個類時,其內部類不會同時被加載 。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生 。
枚舉類實現單例模式是 effective java 作者極力推薦的單例實現模式,因為枚舉類型是線程安全的,并且只會裝載一次,設計者充分的利用了枚舉的這個特性來實現單例模式,枚舉的寫法非常簡單,而且枚舉類型是所用單例實現中唯一一種不會被破壞的單例實現模式 。因為枚舉類沒有構造方法,可以防止反序列化操作 。
1、除枚舉方式外, 其他方法都會通過反射的方式破壞單例,反射是通過調用構造方法生成新的對象,所以如果我們想要阻止單例破壞,可以在構造方法中進行判斷,若已有實例, 則阻止生成新的實例,解決辦法如下:
2、如果單例類實現了序列化接口Serializable, 就可以通過反序列化破壞單例,所以我們可以不實現序列化接口,如果非得實現序列化接口,可以重寫反序列化方法readResolve(), 反序列化時直接返回相關單例對象 。
Runtime是一個典型的例子,看下JDK API對于這個類的解釋"每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接,可以通過getRuntime方法獲取當前運行時 。應用程序不能創建自己的Runtime類實例 。",這段話,有兩點很重要:
1、每個應用程序都有一個Runtime類實例
2、應用程序不能創建自己的Runtime類實例
只有一個、不能自己創建,是不是典型的單例模式?看一下,Runtime類的寫法:
為了節約系統資源,有時需要確保系統中某個類只有唯一一個實例,當這個唯一實例創建成功之后,我們無法再創建一個同類型的其他對象,所有的操作都只能基于這個唯一實例 。為了確保對象的唯一性,我們可以通過單例模式來實現 。
單例模式應用的場景一般發現在以下條件下:
(1)資源共享的情況下,避免由于資源操作時導致的性能或損耗等 。如上述中的日志文件,應用配置 。
(2)控制資源的情況下,方便資源之間的互相通信 。如線程池等 。
關于單例模式的漫畫分析: https://mp.weixin.qq.com/s/f-sJIZHr7JUa31gKTllSFQ
單例模式的優缺點、注意事項、使用場景
設計模式都有哪些?
總體來說設計模式分為三大類:
一、創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式 。
二、結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式 。
三、行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式 。
1、工廠方法模式:
定義一個用于創建對象的接口,讓子類決定實例化哪一個類 。Factory Method 使一個類的實例化延遲到其子類 。
工廠模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,這就用到工廠方法模式 。
創建一個工廠接口和創建多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼 。
2、抽象工廠模式:
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類 。抽象工廠需要創建一些列產品,著重點在于"創建哪些"產品上,也就是說,如果你開發,你的主要任務是劃分不同差異的產品線,并且盡量保持每條產品線接口一致,從而可以從同一個抽象工廠繼承 。
3、單例模式:
單例對象(Singleton)是一種常用的設計模式 。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在 。這樣的模式有幾個好處:
(1)某些類創建比較頻繁,對于一些大型的對象,這是一筆很大的系統開銷 。
(2)省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力 。
(3)有些類如交易所的核心交易引擎,控制著交易流程,如果該類可以創建多個的話,系統完全亂了 。(比如一個軍隊出現了多個司令員同時指揮,肯定會亂成一團),所以只有使用單例模式,才能保證核心交易服務器獨立控制整個流程 。
4、建造者模式:
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 。
5、原型模式:
原型模式雖然是創建型的模式,但是與工程模式沒有關系,從名字即可看出,該模式的思想就是將一個對象作為原型,對其進行復制、克隆,產生一個和原對象類似的新對象 。本小結會通過對象的復制,進行講解 。在Java中,復制對象是通過clone()實現的,先創建一個原型類 。
6、適配器模式:
適配器模式將某個類的接口轉換成客戶端期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題 。主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式 。
7、裝飾器模式:
顧名思義,裝飾模式就是給一個對象增加一些新的功能,而且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例 。
8、代理模式:
代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什么呢?因為你對該地區房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思 。
9、外觀模式:
外觀模式是為了解決類與類之家的依賴關系的,像spring一樣,可以將類和類之間的關系配置到配置文件中,而外觀模式就是將他們的關系放在一個Facade類中,降低了類類之間的耦合度,該模式中沒有涉及到接口 。
10、橋接模式:
橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化 。橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化,像我們常用的JDBC橋DriverManager一樣 。
JDBC進行連接數據庫的時候,在各個數據庫之間進行切換,基本不需要動太多的代碼,甚至絲毫不用動,原因就是JDBC提供統一接口,每個數據庫提供各自的實現,用一個叫做數據庫驅動的程序來橋接就行了 。
11、組合模式:
組合模式有時又叫部分-整體模式在處理類似樹形結構的問題時比較方便 。使用場景:將多個對象組合在一起進行操作,常用于表示樹形結構中,例如二叉樹,數等 。
12、享元模式:
享元模式的主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用 。
13、策略模式:
策略模式定義了一系列算法,并將每個算法封裝起來,使其可以相互替換,且算法的變化不會影響到使用算法的客戶 。需要設計一個接口,為一系列實現類提供統一的方法,多個實現類實現該接口,設計一個抽象類(可有可無,屬于輔助類),提供輔助函數 。
14、模板方法模式:
一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過調用抽象類,實現對子類的調用 。
15、觀察者模式:
觀察者模式很好理解,類似于郵件訂閱和RSS訂閱,當我們瀏覽一些博客或wiki時,經常會看到RSS圖標,就這的意思是,當你訂閱了該文章,如果后續有更新,會及時通知你 。
其實,簡單來講就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,并且隨著變化!對象之間是一種一對多的關系 。
16、迭代子模式:
顧名思義,迭代器模式就是順序訪問聚集中的對象,一般來說,集合中非常常見,如果對集合類比較熟悉的話,理解本模式會十分輕松 。這句話包含兩層意思:一是需要遍歷的對象,即聚集對象,二是迭代器對象,用于對聚集對象進行遍歷訪問 。
17、責任鏈模式:
責任鏈模式,有多個對象,每個對象持有對下一個對象的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求 。但是發出者并不清楚到底最終那個對象會處理該請求,所以,責任鏈模式可以實現,在隱瞞客戶端的情況下,對系統進行動態的調整 。
18、命令模式:
命令模式的目的就是達到命令的發出者和執行者之間解耦,實現請求和執行分開 。
19、備忘錄模式:
主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象,個人覺得叫備份模式更形象些,通俗的講下:假設有原始類A,A中有各種屬性,A可以決定需要備份的屬性,備忘錄類B是用來存儲A的一些內部狀態,類C呢,就是一個用來存儲備忘錄的,且只能存儲,不能修改等操作 。
20、狀態模式:
狀態模式在日常開發中用的挺多的,尤其是做網站的時候,我們有時希望根據對象的某一屬性,區別開他們的一些功能,比如說簡單的權限控制等 。
21、訪問者模式:
訪問者模式把數據結構和作用于結構上的操作解耦合,使得操作集合可相對自由地演化 。訪問者模式適用于數據結構相對穩定算法又易變化的系統 。因為訪問者模式使得算法操作增加變得容易 。
若系統數據結構對象易于變化,經常有新的數據對象增加進來,則不適合使用訪問者模式 。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者 。訪問者模式將有關行為集中到一個訪問者對象中,其改變不影響系統數據結構 。其缺點就是增加新的數據結構很困難 。
22、中介者模式:
中介者模式也是用來降低類類之間的耦合的,因為如果類類之間有依賴關系的話,不利于功能的拓展和維護,因為只要修改一個對象,其它關聯的對象都得進行修改 。
如果使用中介者模式,只需關心和Mediator類的關系,具體類類之間的關系及調度交給Mediator就行,這有點像spring容器的作用 。
23、解釋器模式:
解釋器模式一般主要應用在OOP開發中的編譯器的開發中,所以適用面比較窄 。
擴展資料:
介紹三本關于設計模式的書:
1、《設計模式:可復用面向對象軟件的基礎》
作者:[美] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
出版社: 機械工業出版社
2、《軟件秘笈:設計模式那點事》
作者:鄭阿奇
出版社:電子工業出版社
3、《設計模式:基于C#的工程化實現及擴展》
作者:王翔
出版社:電子工業出版社
參考資料來源:百度百科-設計模式
程序開發中設計模式的概念是什么呢?
你好,很高興回答你的問題 。
設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結 。
1.設計模式代表了最佳的實踐,在平時的開發中通常被有經驗的面向對象的軟件開發人員所采用 。設計模式就是是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案 。這些解決方案是眾多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的 。
2.使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性 。毫無疑問,設計模式于己于他人于系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊鉆石一樣 。項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是設計模式能被廣泛應用的原因 。
希望能幫到你,謝謝!
程序中的設計模式設計都有什么原則呢?
你好,很高興能回答你的問題 。
程序軟件開發中設計模式常用的的六大原則有下面幾個:
1、開閉原則
開閉原則的意思是:對擴展開放,對修改關閉 。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果 。簡言之,是為了使程序的擴展性好,易于維護和升級 。想要達到這樣的效果,我們需要使用接口和抽象類,后面的具體設計中我們會提到這點 。
2、里氏代換原則
里氏代換原則是面向對象設計的基本原則之一 。里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現 。LSP 是繼承復用的基石,只有當派生類可以替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被復用,而派生類也能夠在基類的基礎上增加新的行為 。里氏代換原則是對開閉原則的補充 。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范 。
3、依賴倒轉原則
這個原則是開閉原則的基礎,具體內容:針對接口編程,依賴于抽象而不依賴于具體 。
4、接口隔離原則
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好 。它還有另外一個意思是:降低類之間的耦合度 。由此可見,其實設計模式就是從大型軟件架構出發、便于升級和維護的軟件設計思想,它強調降低依賴,降低耦合 。
5、迪米特法則,又稱最少指導原則
最少指導原則是指:一個實體應當盡量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立 。
6、合成復用原則
合成復用原則是指:盡量使用合成/聚合的方式,而不是使用繼承 。
工廠模式主要的意圖是:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行 。
案列1:您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實現 。2、Hibernate 換數據庫只需換方言和驅動就可以 。
優點: 1、一個調用者想創建一個對象,只要知道其名稱就可以了 。2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以 。3、屏蔽產品的具體實現,調用者只關心產品的接口 。
缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴 。這并不是什么好事 。
案例2:日志記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日志到什么地方 。2、數據庫訪問,當用戶不知道最后系統采用哪一類數據庫,以及數據庫可能有變化時 。3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個接口 。
注意事項:作為一種創建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式 。有一點需要注意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式 。如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度 。
希望能幫到你,謝謝!
程序設計模式是什么?
設計模式主要分三個類型:創建型、結構型和行為型 。
其中創建型有:
一、Singleton,單例模式:保證一個類只有一個實例,并提供一個訪問它的全局訪問點
二、Abstract Factory,抽象工廠:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們的具體類 。
三、Factory Method,工廠方法:定義一個用于創建對象的接口,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到了子類 。
四、Builder,建造模式:將一個復雜對象的構建與他的表示相分離,使得同樣的構建過程可以創建不同的表示 。
五、Prototype,原型模式:用原型實例指定創建對象的種類,并且通過拷貝這些原型來創建新的對象 。
行為型有:
六、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內部表示 。
七、Observer,觀察者模式:定義對象間一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知自動更新 。
八、Template Method,模板方法:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結構即可以重定義該算法得某些特定步驟 。
九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日志,以及支持可撤銷的操作 。
十、State,狀態模式:允許對象在其內部狀態改變時改變他的行為 。對象看起來似乎改變了他的類 。
十一、Strategy,策略模式:定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶 。
十二、China of Responsibility,職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關系
十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象交互 。
十四、Visitor,訪問者模式:表示一個作用于某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作 。
十五、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子 。
十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態 。
結構型有:
十七、Composite,組合模式:將對象組合成樹形結構以表示部分整體的關系,Composite使得用戶對單個對象和組合對象的使用具有一致性 。
十八、Facade,外觀模式:為子系統中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統更容易使用 。
十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問
二十、Adapter,適配器模式:將一類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作 。
二十一、Decrator,裝飾模式:動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比生成子類更加靈活 。
二十二、Bridge,橋模式:將抽象部分與它的實現部分相分離,使他們可以獨立的變化 。
二十三、Flyweight,享元模式
java常用的的設計模式和開發模式都有哪些
設計模式主要分三個類型、創建型、結構型和行為型 。設計模式分:3種類型及23種模式 。
JAVA中的開發模式:MVC是一個很常用的程序開發設計模式,M-Model(模型):封裝應用程序的狀態;V-View(視圖):表示用戶界面;C-Controller(控制器):對用戶的輸入作出反應,創建并設置模型 。
擴展資料
創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式 。
結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式 。
行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式 。
參考資料:百度百科 設計模式
百度百科 JAVA
關于程序設計模式和程序設計模式作用的內容就分享到這兒!更多實用知識經驗,盡在 m.apearl.cn
- 訾怎么讀拼音是什么意思,訾作為姓氏念什么
- 斗姆元君的簡介,斗姆元君心咒
- 中國四大奇石是什么 四大奇石圖片
- 儕輩的拼音,儕輩跟隨愧望塵讀音
- 尊敬拼音怎么讀,尊敬拼音是什么意思
- 二月二十四是啥星座 農歷二月二十四是什么星座
- 拱手禮的正確姿勢是什么,拱手禮的含義
- 精美別致的別致是什么意思,小東西長挺別致是什么意思
- 女生說輕薄是什么意思,公如是,是輕薄的輕薄是什么意思
- 買櫝還珠的寓意和道理是什么 買櫝還珠的哲學寓意
