設(shè)計(jì)模式

1、設(shè)計(jì)模式分類(lèi) 參考

創(chuàng)建型(5種):將對(duì)象的創(chuàng)建與使用分離,使用者不需要關(guān)注對(duì)象的創(chuàng)建細(xì)節(jié)

  • 單例(Singleton)模式:某個(gè)類(lèi)只能生成一個(gè)實(shí)例,該類(lèi)提供了一個(gè)全局訪問(wèn)點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。

  • 原型(Prototype)模式
    定義:將一個(gè)對(duì)象作為原型,通過(guò)對(duì)其進(jìn)行復(fù)制而克隆出多個(gè)和原型類(lèi)似的新實(shí)例。
    應(yīng)用場(chǎng)景:
    a. 對(duì)象之間相同或相似,即只是個(gè)別的幾個(gè)屬性不同的時(shí)候。
    b. 對(duì)象的創(chuàng)建過(guò)程比較麻煩,但復(fù)制比較簡(jiǎn)單的時(shí)候。例如:孫悟空吹一根毫毛變出一個(gè)自己


    原型模式結(jié)構(gòu)圖
  • 工廠方法(FactoryMethod)模式
    定義:一個(gè)用于創(chuàng)建產(chǎn)品的接口,由子類(lèi)決定生產(chǎn)什么產(chǎn)品。
    應(yīng)用場(chǎng)景:
    a. 客戶只知道創(chuàng)建產(chǎn)品的工廠名,而不知道具體的產(chǎn)品名。如 TCL 電視工廠、海信電視工廠等。
    b. 創(chuàng)建對(duì)象的任務(wù)由多個(gè)具體子工廠中的某一個(gè)完成,而抽象工廠只提供創(chuàng)建產(chǎn)品的接口。
    c. 客戶不關(guān)心創(chuàng)建產(chǎn)品的細(xì)節(jié),只關(guān)心產(chǎn)品的品牌。


    工廠方法模式結(jié)構(gòu)圖
  • 抽象工廠(AbstractFactory)模式
    定義:提供一個(gè)創(chuàng)建產(chǎn)品族的接口,其每個(gè)子類(lèi)可以生產(chǎn)一系列相關(guān)的產(chǎn)品。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴(lài)的產(chǎn)品族時(shí),如電器工廠中的電視機(jī)、洗衣機(jī)、空調(diào)等。
    b. 系統(tǒng)中有多個(gè)產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品。如有人只喜歡穿某一個(gè)品牌的衣服和鞋。
    c. 系統(tǒng)中提供了產(chǎn)品的類(lèi)庫(kù),且所有產(chǎn)品的接口相同,客戶端不依賴(lài)產(chǎn)品實(shí)例的創(chuàng)建細(xì)節(jié)和內(nèi)部結(jié)構(gòu)。


    抽象工廠結(jié)構(gòu)圖
  • 建造者(Builder)模式
    定義:將一個(gè)復(fù)雜對(duì)象分解成多個(gè)相對(duì)簡(jiǎn)單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對(duì)象。
    應(yīng)用場(chǎng)景:
    a. 創(chuàng)建的對(duì)象較復(fù)雜,由多個(gè)部件構(gòu)成,各部件面臨著復(fù)雜的變化,但構(gòu)件間的建造順序是穩(wěn)定的。
    b. 創(chuàng)建復(fù)雜對(duì)象的算法獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式,即產(chǎn)品的構(gòu)建過(guò)程和最終的表示是獨(dú)立的。


    創(chuàng)建者模式結(jié)構(gòu)圖

結(jié)構(gòu)型(7種):描述如何將類(lèi)或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類(lèi)結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式,前者采用繼承機(jī)制來(lái)組織接口和類(lèi),后者釆用組合或聚合來(lái)組合對(duì)象。

  • 代理(Proxy)模式
    定義:為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。即客戶端通過(guò)代理間接地訪問(wèn)該對(duì)象,從而限制、增強(qiáng)或修改該對(duì)象的一些特性。
    應(yīng)用場(chǎng)景:
    a. 遠(yuǎn)程代理,這種方式通常是為了隱藏目標(biāo)對(duì)象存在于不同地址空間的事實(shí),方便客戶端訪問(wèn)。例如,用戶申請(qǐng)某些網(wǎng)盤(pán)空間時(shí),會(huì)在用戶的文件系統(tǒng)中建立一個(gè)虛擬的硬盤(pán),用戶訪問(wèn)虛擬硬盤(pán)時(shí)實(shí)際訪問(wèn)的是網(wǎng)盤(pán)空間。
    b. 虛擬代理,這種方式通常用于要?jiǎng)?chuàng)建的目標(biāo)對(duì)象開(kāi)銷(xiāo)很大時(shí)。例如,下載一幅很大的圖像需要很長(zhǎng)時(shí)間,因某種計(jì)算比較復(fù)雜而短時(shí)間無(wú)法完成,這時(shí)可以先用小比例的虛擬代理替換真實(shí)的對(duì)象,消除用戶對(duì)服務(wù)器慢的感覺(jué)。
    c. 安全代理,這種方式通常用于控制不同種類(lèi)客戶對(duì)真實(shí)對(duì)象的訪問(wèn)權(quán)限。
    d. 智能指引,主要用于調(diào)用目標(biāo)對(duì)象時(shí),代理附加一些額外的處理功能。例如,增加計(jì)算真實(shí)對(duì)象的引用次數(shù)的功能,這樣當(dāng)該對(duì)象沒(méi)有被引用時(shí),就可以自動(dòng)釋放它。
    e. 延遲加載,指為了提高系統(tǒng)的性能,延遲對(duì)目標(biāo)的加載。例如,Hibernate中就存在屬性的延遲加載和關(guān)聯(lián)表的延時(shí)加載。


    代理模式結(jié)構(gòu)圖
  • 適配器(Adapter)模式
    定義:將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類(lèi)能一起工作。
    應(yīng)用場(chǎng)景:
    a. 以前開(kāi)發(fā)的系統(tǒng)存在滿足新系統(tǒng)功能需求的類(lèi),但其接口同新系統(tǒng)的接口不一致。
    b. 使用第三方提供的組件,但組件接口定義和自己要求的接口定義不同。
    例如:新能源汽車(chē)的發(fā)動(dòng)機(jī)有電能發(fā)動(dòng)機(jī)(Electric Motor)和光能發(fā)動(dòng)機(jī)(Optical Motor)等,各種發(fā)動(dòng)機(jī)的驅(qū)動(dòng)方法不同


    適配器模式結(jié)構(gòu)圖
  • 橋接(Bridge)模式
    定義:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)的,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)一個(gè)類(lèi)存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展時(shí)。
    b. 當(dāng)一個(gè)系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)急劇增加時(shí)。
    c. 當(dāng)一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性時(shí)。
    例如:女士皮包有很多種,可以按用途分、按皮質(zhì)分、按品牌分、按顏色分、按大小分等,存在多個(gè)維度的變化


    橋接模式結(jié)構(gòu)圖
  • 裝飾(Decorator)模式
    定義:指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式。當(dāng)使用代理模式的時(shí)候,我們常常在一個(gè)代理類(lèi)中創(chuàng)建一個(gè)對(duì)象的實(shí)例。并且,當(dāng)我們使用裝飾器模式的時(shí)候,我們通常的做法是將原始對(duì)象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)需要給一個(gè)現(xiàn)有類(lèi)添加附加職責(zé),而又不能采用生成子類(lèi)的方法進(jìn)行擴(kuò)充時(shí)。例如,該類(lèi)被隱藏或者該類(lèi)是終極類(lèi)或者采用繼承方式會(huì)產(chǎn)生大量的子類(lèi)。
    b. 當(dāng)需要通過(guò)對(duì)現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多的功能時(shí),采用繼承關(guān)系很難實(shí)現(xiàn),而采用裝飾模式卻很好實(shí)現(xiàn)。
    c. 當(dāng)對(duì)象的功能要求可以動(dòng)態(tài)地添加,也可以再動(dòng)態(tài)地撤銷(xiāo)時(shí)。例如:角色換膚


    裝飾模式結(jié)構(gòu)圖
  • 外觀(Facade)模式
    定義:是一種通過(guò)為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問(wèn)的模式。
    應(yīng)用場(chǎng)景:
    a. 對(duì)分層結(jié)構(gòu)系統(tǒng)構(gòu)建時(shí),使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡(jiǎn)化子系統(tǒng)之間的依賴(lài)關(guān)系。
    b. 當(dāng)一個(gè)復(fù)雜系統(tǒng)的子系統(tǒng)很多時(shí),外觀模式可以為系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的接口供外界訪問(wèn)。

    c. 當(dāng)客戶端與多個(gè)子系統(tǒng)之間存在很大的聯(lián)系時(shí),引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性。
    外觀模式結(jié)構(gòu)圖
  • 享元(Flyweight)模式
    定義:運(yùn)用共享技術(shù)來(lái)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。它通過(guò)共享已經(jīng)存在的又橡來(lái)大幅度減少需要?jiǎng)?chuàng)建的對(duì)象數(shù)量、避免大量相似類(lèi)的開(kāi)銷(xiāo),從而提高系統(tǒng)資源的利用率。
    應(yīng)用場(chǎng)景:
    a. 系統(tǒng)中存在大量相同或相似的對(duì)象,這些對(duì)象耗費(fèi)大量的內(nèi)存資源。
    b. 大部分的對(duì)象可以按照內(nèi)部狀態(tài)進(jìn)行分組,且可將不同部分外部化,這樣每一個(gè)組只需保存一個(gè)內(nèi)部狀態(tài)。

    c. 由于享元模式需要額外維護(hù)一個(gè)保存享元的數(shù)據(jù)結(jié)構(gòu),所以應(yīng)當(dāng)在有足夠多的享元實(shí)例時(shí)才值得使用享元模式。例如:五子棋游戲
    享元模式結(jié)構(gòu)圖
  • 組合(Composite)模式
    定義:有時(shí)又叫作部分-整體模式,它是一種將對(duì)象組合成樹(shù)狀的層次結(jié)構(gòu)的模式,用來(lái)表示“部分-整體”的關(guān)系,使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問(wèn)性。
    應(yīng)用場(chǎng)景:
    a. 在需要表示一個(gè)對(duì)象整體與部分的層次結(jié)構(gòu)的場(chǎng)合。
    b. 要求對(duì)用戶隱藏組合對(duì)象與單個(gè)對(duì)象的不同,用戶可以用統(tǒng)一的接口使用組合結(jié)構(gòu)中的所有對(duì)象的場(chǎng)合。例如:選購(gòu)商品


    組合模式結(jié)構(gòu)圖

行為型(11種):分為類(lèi)行為模式和對(duì)象行為模式,前者采用繼承機(jī)制來(lái)在類(lèi)間分派行為,后者采用組合或聚合在對(duì)象間分配行為

  • 模板方法(Template Method)模式
    定義:定義一個(gè)操作中的算法骨架,而將算法的一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟。
    應(yīng)用場(chǎng)景:
    a. 算法的整體步驟很固定,但其中個(gè)別部分易變時(shí),這時(shí)候可以使用模板方法模式,將容易變的部分抽象出來(lái),供子類(lèi)實(shí)現(xiàn)。
    b. 當(dāng)多個(gè)子類(lèi)存在公共的行為時(shí),可以將其提取出來(lái)并集中到一個(gè)公共父類(lèi)中以避免代碼重復(fù)。首先,要識(shí)別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個(gè)調(diào)用這些新的操作的模板方法來(lái)替換這些不同的代碼。
    c. 當(dāng)需要控制子類(lèi)的擴(kuò)展時(shí),模板方法只在特定點(diǎn)調(diào)用鉤子操作,這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。例如:出國(guó)留學(xué)手續(xù)設(shè)計(jì)程序


    模版方法模式結(jié)構(gòu)圖
  • 策略(Strategy)模式
    定義:該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。
    應(yīng)用場(chǎng)景:
    a. 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種時(shí),可將每個(gè)算法封裝到策略類(lèi)中。
    b. 一個(gè)類(lèi)定義了多種行為,并且這些行為在這個(gè)類(lèi)的操作中以多個(gè)條件語(yǔ)句的形式出現(xiàn),可將每個(gè)條件分支移入它們各自的策略類(lèi)中以代替這些條件語(yǔ)句。
    c. 系統(tǒng)中各算法彼此完全獨(dú)立,且要求對(duì)客戶隱藏具體算法的實(shí)現(xiàn)細(xì)節(jié)時(shí)。
    d. 系統(tǒng)要求使用算法的客戶不應(yīng)該知道其操作的數(shù)據(jù)時(shí),可使用策略模式來(lái)隱藏與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
    e. 多個(gè)類(lèi)只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。例如:清蒸大閘蟹和紅燒大閘蟹兩種方法


    策略模式結(jié)構(gòu)圖
  • 命令(Command)模式
    定義:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,使發(fā)出請(qǐng)求的責(zé)任和執(zhí)行請(qǐng)求的責(zé)任分割開(kāi)。這樣兩者之間通過(guò)命令對(duì)象進(jìn)行溝通,這樣方便將命令對(duì)象進(jìn)行儲(chǔ)存、傳遞、調(diào)用、增加與管理。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)系統(tǒng)需要將請(qǐng)求調(diào)用者與請(qǐng)求接收者解耦時(shí),命令模式使得調(diào)用者和接收者不直接交互。
    b. 當(dāng)系統(tǒng)需要隨機(jī)請(qǐng)求命令或經(jīng)常增加或刪除命令時(shí),命令模式比較方便實(shí)現(xiàn)這些功能。
    c. 當(dāng)系統(tǒng)需要執(zhí)行一組操作時(shí),命令模式可以定義宏命令來(lái)實(shí)現(xiàn)該功能。
    d. 當(dāng)系統(tǒng)需要支持命令的撤銷(xiāo)(Undo)操作和恢復(fù)(Redo)操作時(shí),可以將命令對(duì)象存儲(chǔ)起來(lái),采用備忘錄模式來(lái)實(shí)現(xiàn)。
    例如:客戶去餐館可選擇的早餐有腸粉、河粉和餛飩等,客戶可向服務(wù)員選擇以上早餐中的若干種,服務(wù)員將客戶的請(qǐng)求交給相關(guān)的廚師去做。這里的點(diǎn)早餐相當(dāng)于“命令”,服務(wù)員相當(dāng)于“調(diào)用者”,廚師相當(dāng)于“接收者”


    命令模式結(jié)構(gòu)圖
  • 職責(zé)鏈(Chain of Responsibility)模式
    定義:為了避免請(qǐng)求發(fā)送者與多個(gè)請(qǐng)求處理者耦合在一起,將所有請(qǐng)求的處理者通過(guò)前一對(duì)象記住其下一個(gè)對(duì)象的引用而連成一條鏈;當(dāng)有請(qǐng)求發(fā)生時(shí),可將請(qǐng)求沿著這條鏈傳遞,直到有對(duì)象處理它為止。
    應(yīng)用場(chǎng)景:
    a. 有多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定。
    b. 可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求,或添加新的處理者。
    c. 在不明確指定請(qǐng)求處理者的情況下,向多個(gè)處理者中的一個(gè)提交請(qǐng)求。
    假如:規(guī)定學(xué)生請(qǐng)假小于或等于 2 天,班主任可以批準(zhǔn);小于或等于 7 天,系主任可以批準(zhǔn);小于或等于 10 天,院長(zhǎng)可以批準(zhǔn);其他情況不予批準(zhǔn);這個(gè)實(shí)例適合使用職責(zé)鏈模式實(shí)現(xiàn)。


    職責(zé)鏈模式結(jié)構(gòu)圖
  • 狀態(tài)(State)模式
    定義:對(duì)有狀態(tài)的對(duì)象,把復(fù)雜的“判斷邏輯”提取到不同的狀態(tài)對(duì)象中,允許狀態(tài)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變它的行為時(shí),就可以考慮使用狀態(tài)模式。
    b. 一個(gè)操作中含有龐大的分支結(jié)構(gòu),并且這些分支決定于對(duì)象的狀態(tài)時(shí)。例如學(xué)生成績(jī)的狀態(tài)轉(zhuǎn)換程序
    例如:“不及格”“中等”和“優(yōu)秀” 3 種狀態(tài),當(dāng)學(xué)生的分?jǐn)?shù)小于 60 分時(shí)為“不及格”狀態(tài),當(dāng)分?jǐn)?shù)大于等于 60 分且小于 90 分時(shí)為“中等”狀態(tài),當(dāng)分?jǐn)?shù)大于等于 90 分時(shí)為“優(yōu)秀”狀態(tài)


    狀態(tài)模式結(jié)構(gòu)圖
  • 觀察者(Observer)模式
    定義:指多個(gè)對(duì)象間存在一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。這種模式有時(shí)又稱(chēng)作發(fā)布-訂閱模式、模型-視圖模式。
    應(yīng)用場(chǎng)景:
    a. 對(duì)象間存在一對(duì)多關(guān)系,一個(gè)對(duì)象的狀態(tài)發(fā)生改變會(huì)影響其他對(duì)象。
    b. 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴(lài)于另一方面時(shí),可將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。
    例如:當(dāng)“人民幣匯率”升值時(shí),進(jìn)口公司的進(jìn)口產(chǎn)品成本降低且利潤(rùn)率提升,出口公司的出口產(chǎn)品收入降低且利潤(rùn)率降低;當(dāng)“人民幣匯率”貶值時(shí),進(jìn)口公司的進(jìn)口產(chǎn)品成本提升且利潤(rùn)率降低,出口公司的出口產(chǎn)品收入提升且利潤(rùn)率提升。


    觀察者模式結(jié)構(gòu)圖
  • 中介者(Mediator)模式
    定義:定義一個(gè)中介對(duì)象來(lái)封裝一系列對(duì)象之間的交互,使原有對(duì)象之間的耦合松散,且可以獨(dú)立地改變它們之間的交互。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)對(duì)象之間存在復(fù)雜的網(wǎng)狀結(jié)構(gòu)關(guān)系而導(dǎo)致依賴(lài)關(guān)系混亂且難以復(fù)用時(shí)。
    b. 當(dāng)想創(chuàng)建一個(gè)運(yùn)行于多個(gè)類(lèi)之間的對(duì)象,又不想生成新的子類(lèi)時(shí)。
    例如:房地產(chǎn)中介公司”提供給“賣(mài)方客戶”與“買(mǎi)方客戶”進(jìn)行信息交流的平臺(tái)。


    中介者模式結(jié)構(gòu)圖
  • 迭代器(Iterator)模式
    定義:提供一個(gè)對(duì)象來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)需要為聚合對(duì)象提供多種遍歷方式時(shí)。
    b. 當(dāng)需要為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口時(shí)。
    c. 當(dāng)訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露其內(nèi)部細(xì)節(jié)的表示時(shí)。
    例如:婺源的名勝古跡較多,一個(gè)查看相關(guān)景點(diǎn)圖片和簡(jiǎn)介的程序。

迭代器模式結(jié)構(gòu)圖
  • 訪問(wèn)者(Visitor)模式
    定義:將作用于某種數(shù)據(jù)結(jié)構(gòu)中的各元素的操作分離出來(lái)封裝成獨(dú)立的類(lèi),使其在不改變數(shù)據(jù)結(jié)構(gòu)的前提下可以添加作用于這些元素的新的操作,為數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素提供多種訪問(wèn)方式。
    應(yīng)用場(chǎng)景:
    a. 對(duì)象結(jié)構(gòu)相對(duì)穩(wěn)定,但其操作算法經(jīng)常變化的程序。
    b. 對(duì)象結(jié)構(gòu)中的對(duì)象需要提供多種不同且不相關(guān)的操作,而且要避免讓這些操作的變化影響對(duì)象的結(jié)構(gòu)。
    c. 對(duì)象結(jié)構(gòu)包含很多類(lèi)型的對(duì)象,希望對(duì)這些對(duì)象實(shí)施一些依賴(lài)于其具體類(lèi)型的操作。
    例如:藝術(shù)公司利用“銅”可以設(shè)計(jì)出銅像,利用“紙”可以畫(huà)出圖畫(huà);造幣公司利用“銅”可以印出銅幣,利用“紙”可以印出紙幣,對(duì)“銅”和“紙”這兩種元素,兩個(gè)公司的處理方法不同


    訪問(wèn)者模式結(jié)構(gòu)圖
  • 備忘錄(Memento)模式
    定義:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),以便以后當(dāng)需要時(shí)能將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
    應(yīng)用場(chǎng)景:
    a. 需要保存與恢復(fù)數(shù)據(jù)的場(chǎng)景,如玩游戲時(shí)的中間結(jié)果的存檔功能。
    b. 需要提供一個(gè)可回滾操作的場(chǎng)景,如 Word、記事本、Photoshop,Eclipse 等軟件在編輯時(shí)按 Ctrl+Z 組合鍵,還有數(shù)據(jù)庫(kù)中事務(wù)操作。


    備忘錄模式結(jié)構(gòu)圖
  • 解釋器(Interpreter)模式
    定義:給分析對(duì)象定義一個(gè)語(yǔ)言,并定義該語(yǔ)言的文法表示,再設(shè)計(jì)一個(gè)解析器來(lái)解釋語(yǔ)言中的句子。
    應(yīng)用場(chǎng)景:
    a. 當(dāng)語(yǔ)言的文法較為簡(jiǎn)單,且執(zhí)行效率不是關(guān)鍵問(wèn)題時(shí)。
    b. 當(dāng)問(wèn)題重復(fù)出現(xiàn),且可以用一種簡(jiǎn)單的語(yǔ)言來(lái)進(jìn)行表達(dá)時(shí)。

    c. 當(dāng)一個(gè)語(yǔ)言需要解釋執(zhí)行,并且語(yǔ)言中的句子可以表示為一個(gè)抽象語(yǔ)法樹(shù)的時(shí)候,如 XML 文檔解釋。
    公交卡讀卡程序解釋圖

2、單例模式

2.1懶漢式

線程不安全,延遲初始化,嚴(yán)格意義上不是不是單例模式

public class Singleton {  
     //靜態(tài)私有成員變量
    private static Singleton instance; 

    //私有構(gòu)造函數(shù),確保用戶無(wú)法通過(guò)new關(guān)鍵字直接實(shí)例化它
    private Singleton (){}  

    //靜態(tài)公有工廠方法,返回唯一實(shí)例
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

2.2餓漢式

線程安全,比較常用,但容易產(chǎn)生垃圾,因?yàn)橐婚_(kāi)始就初始化

public class Singleton {  

    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  
        return instance;  
    }  
}

2.3雙重鎖式

線程安全,延遲初始化。這種方式采用雙鎖機(jī)制,安全且在多線程情況下能保持高性能

public class Singleton {  
    private volatile static Singleton singleton;  

    private Singleton (){}  

    public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
                if (singleton == null) {  
                    singleton = new Singleton();  
                }  
           }  
      }  
      return singleton;  
    }  
}

雙重檢查模式,進(jìn)行了兩次的判斷,第一次是為了避免不要的實(shí)例,第二次是為了進(jìn)行同步,避免多線程問(wèn)題。由于singleton=new Singleton()對(duì)象的創(chuàng)建在JVM中可能會(huì)進(jìn)行重排序,在多線程訪問(wèn)下存在風(fēng)險(xiǎn),使用volatile修飾signleton實(shí)例變量有效,解決該問(wèn)題。

2.4靜態(tài)內(nèi)部類(lèi)

public class Singleton { 
    private Singleton(){
    }
      public static Singleton getInstance(){  
        return Inner.instance;  
    }  
    private static class Inner {  
        private static final Singleton instance = new Singleton();  
    }  
} 

只有第一次調(diào)用getInstance方法時(shí),虛擬機(jī)才加載 Inner 并初始化instance ,只有一個(gè)線程可以獲得對(duì)象的初始化鎖,其他線程無(wú)法進(jìn)行初始化,保證對(duì)象的唯一性。

2.5枚舉

public enum Singleton  {
    INSTANCE 
 
    //doSomething 該實(shí)例支持的行為
      
    //可以省略此方法,通過(guò)Singleton.INSTANCE進(jìn)行操作
    public static Singleton get Instance() {
        return Singleton.INSTANCE;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容