設計模式之單例模式與工廠模式

什么是設計模式?

設計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。這些解決方案是眾多軟件開發(fā)人員經過相當長的一段時間的試驗和錯誤總結出來的。
設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

23種設計模式的分類

創(chuàng)建型模式-->對象怎么來
提供了一種在創(chuàng)建對象的同時隱藏創(chuàng)建邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創(chuàng)建哪些對象時更加靈活。
結構型模式-->對象和誰有關
關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。
行為型模式-->對象與對象在干嘛
特別關注對象之間的通信。

設計模式的六大原則

1、開閉原則(Open Close Principle):對擴展開放,對修改關閉;
2、里氏代換原則(Liskov Substitution Principle):任何基類可以出現的地方,子類一定可以出現。
3、依賴倒轉原則(Dependence Inversion Principle):針對接口編程,依賴于抽象而不依賴于具體。
4、接口隔離原則(Interface Segregation Principle):使用多個隔離的接口,比使用單個接口要好;降低類之間的耦合度。
5、最少知道原則(Demeter Principle):一個實體應當盡量少地與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立。
6、合成復用原則(Composite Reuse Principle):盡量使用合成/聚合的方式,而不是使用繼承。

單例模式

保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
主要解決:一個全局使用的類頻繁地創(chuàng)建與銷毀。
何時使用:當您想控制實例數目,節(jié)省系統(tǒng)資源的時候。
如何解決:判斷系統(tǒng)是否已經有這個單例,如果有則返回,如果沒有則創(chuàng)建。
關鍵代碼:構造函數是私有的。
應用實例: 1、一個黨只能有一個書記。 2、Windows 是多進程多線程的,在操作一個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象,所以所有文件的處理必須通過唯一的實例來進行。 3、一些設備管理器常常設計為單例模式,比如一個電腦有兩臺打印機,在輸出的時候就要處理不能兩臺打印機打印同一個文件。
優(yōu)點: 1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創(chuàng)建和銷毀實例(比如管理學院首頁頁面緩存)。 2、避免對資源的多重占用(比如寫文件操作)。
缺點:沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。
使用場景: 1、要求生產唯一序列號。 2、WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。 3、創(chuàng)建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多線程同時進入造成 instance 被多次實例化。

靜態(tài)成員實例的懶漢模式

懶漢模式:即第一次調用該類實例的時候才產生一個新的該類實例,并在以后僅返回此實例。
需要用鎖,來保證其線程安全性:原因:多個線程可能進入判斷是否已經存在實例的if語句,從而non thread safety。使用double-check來保證thread safety。但是如果處理大量數據時,該鎖才成為嚴重的性能瓶頸。

 1 class Singleton
 2 {
 3 private:
 4     static Singleton* m_instance;
 5     Singleton(){}
 6 public:
 7     static Singleton* getInstance();
 8 };
 9 
10 Singleton* Singleton::getInstance()
11 {
12     if(NULL == m_instance)
13     {
14         Lock();//借用其它類來實現,如boost
15         if(NULL == m_instance)
16         {
17             m_instance = new Singleton;
18         }
19         UnLock();
20     }
21     return m_instance;
22 }

工廠模式

工廠模式分為3種,即簡單工廠模式、工廠方法模式、抽象工廠模式,其實大同小異,總結下來就是:
簡單工廠模式:一個工廠,多個產品。產品需要有一個虛基類。通過傳入參數,生成具體產品對象,并利用基類指針指向此對象。通過工廠獲取此虛基類指針,通過運行時多態(tài),調用子類實現。
使用場景: 1、日志記錄器:記錄可能記錄到本地硬盤、系統(tǒng)事件、遠程服務器等,用戶可以選擇記錄日志到什么地方。 2、數據庫訪問,當用戶不知道最后系統(tǒng)采用哪一類數據庫,以及數據庫可能有變化時。 3、設計一個連接服務器的框架,需要三個協(xié)議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個接口。
工廠方法模式:多個工廠,多個產品,每個產品對應于一個工廠。此時工廠和產品都是通過虛基類的方式構建。對于簡單工廠模式,當要增加一個新產品時候,就需要在工廠類中修改代碼,具體表現為多加一個參數,來識別新的產品類型。此時違反了對擴展開放,對修改關閉的原則。基于此,工廠方法模式應運而生。當增加一個新產品時,同時增加一個新工廠。增加新工廠屬于擴展,不會修改以前工廠類和產品類的任何代碼??梢钥催^多個獨立的簡單工廠模式構成了工廠方法模式。
當一個類不知道它所需要的對象的類時
在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可;
當一個類希望通過其子類來指定創(chuàng)建對象時
在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產品的接口,而由其子類來確定具體要創(chuàng)建的對象,利用面向對象的多態(tài)性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴展。
將創(chuàng)建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創(chuàng)建產品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數據庫中。
抽象工廠模式:多個工廠,多個產品,并且每個產品可以包含多個型號。此時工廠和產品都是通過虛基類的方式構建。每一個工廠類可以生產同一個產品的多個型號。
使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統(tǒng)的程序。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容