清單
模式 | 概要 | 什么時(shí)候選用 | 注意 | 實(shí)操 |
---|---|---|---|---|
單例 | 一個(gè)類只允許創(chuàng)建一個(gè)對象/實(shí)例 | · 處理資源訪問沖突 · 表示全局唯一類 |
· 線程安全問題 | · 餓漢式 · 懶漢式 · ... |
工廠 | 將對象的創(chuàng)建和使用相分離 | · 封裝變化 · 代碼復(fù)用 · 隔離復(fù)雜性 · 控制復(fù)雜度 |
· 別濫用 | creatXX() 或者 getInstance() |
建造者 | 在設(shè)置完屬性后才真正創(chuàng)建對象/實(shí)例 | · 構(gòu)造參數(shù)列表過長着降,且類屬性之間有一定的依賴/約束關(guān)系 | setXX().. -> build() | |
原型 | 利用對已有對象(原型)進(jìn)行拷貝的方式來創(chuàng)建新對象 | · 對象的創(chuàng)建成本比較大都伪,且同一個(gè)類的不同對象之間差別不大 | · 淺拷貝 · 深拷貝 |
clone |
單例模式
- 實(shí)現(xiàn)方式
- 餓漢式
- 在類加載的時(shí)候余指,instance靜態(tài)實(shí)例就已經(jīng)創(chuàng)建并初始化好了。
- 懶漢式
- 延遲加載综慎,加鎖窗宦,性能差。
- 雙重檢測
- 靜態(tài)內(nèi)部類 - JAVA
- 枚舉
- 餓漢式
- 問題
- 對OOP特性的支持不好
- 單例會(huì)隱藏類之間的依賴關(guān)系
- 單例對代碼的擴(kuò)展性不友好
- 單例對代碼的可測試性不友好
- 單例不支持有參數(shù)的構(gòu)造函數(shù)
- 替代方案
- 靜態(tài)方法
工廠模式
- 分類 (個(gè)人認(rèn)為咏闪,不必糾結(jié)這個(gè)分類曙搬,根據(jù)具體的場景設(shè)計(jì),盡量簡單)
- 簡單工廠
- 工廠方法
- 抽象工廠
- 使用工廠模式是為了什么鸽嫂?
- 封裝變化
- 創(chuàng)建邏輯有可能變化纵装,封裝成工廠類之后,創(chuàng)建邏輯的變更對調(diào)用者透明据某。
- 代碼復(fù)用
- 創(chuàng)建代碼抽離到獨(dú)立的工廠類之后可以復(fù)用橡娄。
- 隔離復(fù)雜性
- 封裝復(fù)雜的創(chuàng)建邏輯,調(diào)用者無需了解如何創(chuàng)建對象癣籽。
- 控制復(fù)雜度
- 將創(chuàng)建代碼抽離出來挽唉,讓原本的函數(shù)或類職責(zé)更單一,代碼更簡潔筷狼。
- 封裝變化
建造者模式
- 跟工廠模式的區(qū)別
- 工廠模式
- 用來創(chuàng)建不同但類型相關(guān)的對象(繼承同一個(gè)父類或者接口的一組子類)瓶籽,由給定的參數(shù)來決定創(chuàng)建哪種類型的對象。
- 建造者模式
- 用來創(chuàng)建一種類型的復(fù)雜對象埂材,可以通過設(shè)置不同的可選參數(shù)塑顺,“定制化”地創(chuàng)建不同的對象。
- 比喻
- 走進(jìn)一家餐館點(diǎn)餐俏险,利用工廠模式茬暇,根據(jù)用戶不同的選擇首昔,來制作不同的食物,比如披薩糙俗、漢堡勒奇、沙拉。對于披薩來說巧骚,用戶又有各種配料可以定制赊颠,比如奶酪、西紅柿劈彪、起司竣蹦,我們通過建造者模式根據(jù)用戶選擇的不同配料來制作披薩。
- 工廠模式
原型模式
- 對JavaScript的前端程序員來說沧奴,原型模式是一個(gè)比較常用的開發(fā)模式痘括,因?yàn)镴avaScript是一種基于原型的面向?qū)ο蟪绦蛘Z言
- Java、C++等比較少用原型模式