設(shè)計模式 一

參考網(wǎng)站:設(shè)計模式

創(chuàng)建型模式

單例模式 原型模式 工廠方法模式 抽象工廠方法模式 建造者模式

單例模式

  • 定義:指一個類只能有一個實例,且該類能自行創(chuàng)建這個實例的一種模式。例如,Windows中只能打開一個任務(wù)管理器,這樣可以避免因打開多個任務(wù)管理器窗口而造成資源的浪費,或出現(xiàn)各個窗口顯示內(nèi)容的不一致等錯誤。
  • 3個特點:
    1. 單例類只有一個對象
    2. 該單例對象必須由單例類自行創(chuàng)建
    3. 單例類對外提供一個訪問該單例的全局訪問點
  • 優(yōu)點:
    1. 單例模式可以保證內(nèi)存里只有一個實例,減少了內(nèi)存的開銷。
    2. 可以避免對資源的多重占用
    3. 單例模式設(shè)置全局訪問點,可以優(yōu)化和共享資源的訪問。
  • 缺點:
    1. 單例模式一般沒有接口,擴展困難。如果要擴展,則除了修改原來的代碼,沒有第二種途徑。
    2. 在并發(fā)測試中,單例模式不利于代碼調(diào)優(yōu)。在調(diào)試過程中,如果單例中的代碼沒有執(zhí)行完,也不能模擬生成一個新的對象。
    3. 單例模式的功能代碼通常寫在一個類中,如果功能設(shè)計不合理,則很容易違背單一職責(zé)的原則。
  • 應(yīng)用場景
    1. 需要頻繁創(chuàng)建的一些類,使用單例可以降低系統(tǒng)的內(nèi)存壓力,減少GC。
    2. 某類只要求生成一個對象的時候。
    3. 某些類創(chuàng)建實例時占用資源較多,或?qū)嵗臅r較長,且經(jīng)常使用。
    4. 頻繁訪問數(shù)據(jù)庫或文件的對象。(只建立一次連接)
    5. 對于一些控制硬件級別的操作,或者從系統(tǒng)上講應(yīng)當(dāng)是單一控制邏輯的操作,如果有多個實例,則系統(tǒng)會完全亂套。
    6. 當(dāng)對象需要被共享時。由于單例模式只允許創(chuàng)建一個對象,共享該對象可以節(jié)省內(nèi)存。

原型模式

  • 定義:用一個已經(jīng)創(chuàng)建的實例作為原型,通過復(fù)制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實例指定了要創(chuàng)建的對象的種類。用這種方法創(chuàng)建對象非常高效,根本無需知道對象創(chuàng)建的細(xì)節(jié)。
  • 模式的結(jié)構(gòu)
    由于Java提供了對象的clone()方法,所以用Java實現(xiàn)原型模式很簡單。
    原型模式包含以下主要角色:
    1. 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口
    2. 具體原型類:實現(xiàn)抽象原型類中的clone()方法,它是可被復(fù)制的對象
    3. 訪問類:使用具體原型類中的clone()方法來復(fù)制新的對象
  • 模式的實現(xiàn):
    原型模式的克隆分為淺克隆深克隆
    1. 淺克?。簞?chuàng)建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內(nèi)存地址
    2. 深克?。簞?chuàng)建一個新對象,屬性中引用的其他對象也會被克隆,不再指向原有對象地址。
  • 應(yīng)用場景:
    1. 對象之間相同或相似,即只是個別屬性不同的時候
    2. 創(chuàng)建對象成本較大,例如初始化時間太長,占用CPU太多,或者占用網(wǎng)絡(luò)資源太多等,需要優(yōu)化資源
    3. 創(chuàng)建一個對象需要繁瑣的數(shù)據(jù)準(zhǔn)備和訪問權(quán)限等,需要提高性能或者提高安全性
    4. 系統(tǒng)中大量使用該類對象,且各個調(diào)用者都需要給它重新賦值

簡單(靜態(tài))工廠模式

  • 工廠模式定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當(dāng)中。
  • 簡單工廠模式:有一個具體的工廠類,可以生成多個不同的產(chǎn)品。
  • 優(yōu)點:
  1. 工廠類包含必要的邏輯判斷,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品的實例。客戶端可以免除直接創(chuàng)建產(chǎn)品對象的職責(zé),很方便地創(chuàng)建出相應(yīng)的產(chǎn)品。工廠和產(chǎn)品的職責(zé)區(qū)分明確。
  2. 客戶端無需知道所創(chuàng)建具體產(chǎn)品的類名,只需要知道參數(shù)即可。
  3. 也可以引入配置文件,在不修改客戶端代碼的情況下更換和添加新的具體產(chǎn)品類。
  • 缺點:
  1. 簡單工廠模式的工廠類單一,負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,職責(zé)過重,一旦異常,整個系統(tǒng)將受影響。且工廠類代碼會非常臃腫,違背高聚合原則。
  2. 使用簡單工廠模式會增加系統(tǒng)中類的個數(shù)(引入新的工廠類),增加系統(tǒng)的復(fù)雜度和理解難度。
  3. 系統(tǒng)擴展困難,一旦增加新產(chǎn)品不得不修改工廠邏輯,在產(chǎn)品類型較多時,可能造成邏輯過于復(fù)雜
  4. 簡單工廠模式使用static工廠方法,造成工廠角色無法形成基于繼承的等級結(jié)構(gòu)。
  • 應(yīng)用場景:
    對于產(chǎn)品種類相對較少的情況,考慮使用簡單工廠模式。使用簡單工廠模式的客戶端只需要傳入工廠類的參數(shù),不需要關(guān)心如何創(chuàng)建對象的邏輯,可以很方便地創(chuàng)建所需產(chǎn)品。
  • 模式的結(jié)構(gòu):
  1. 簡單工廠(SimpleFactory):是簡單工廠模式的核心,負(fù)責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象。
  2. 抽象產(chǎn)品(Product):是簡單工廠創(chuàng)建的所有對象的父類,負(fù)責(zé)描述所有實例共有的公共接口。
  3. 具體產(chǎn)品(ConcreteProduct):是簡單工廠模式的創(chuàng)建目標(biāo)。

工廠方法模式

  • 優(yōu)點:
  1. 用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的具體創(chuàng)建過程。
  2. 靈活性增強,對于新產(chǎn)品的創(chuàng)建,只需多寫一個相應(yīng)的工廠類。
  3. 高層模塊只需要知道產(chǎn)品的抽象類,無須關(guān)心其他實現(xiàn)類。
  • 缺點:
  1. 類的個數(shù)容易過多,增加復(fù)雜度
  2. 增加了系統(tǒng)的抽象性和理解難度
  3. 抽象產(chǎn)品只能生產(chǎn)一種產(chǎn)品,此弊端可以使用抽象工廠模式解決
  • 應(yīng)用場景:
  1. 客戶只知道創(chuàng)建產(chǎn)品的工廠名,而不知道具體的產(chǎn)品名。
  2. 創(chuàng)建對象的任務(wù)由多個具體子工廠中的某一個完成,而抽象工廠只提供創(chuàng)建產(chǎn)品的接口。
  3. 客戶不關(guān)心創(chuàng)建產(chǎn)品的細(xì)節(jié),只關(guān)心產(chǎn)品的品牌
  • 模式的結(jié)構(gòu)
  1. 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法 newProduct() 來創(chuàng)建產(chǎn)品。
  2. 具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
  3. 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
  4. 具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。
    工廠方法模式

抽象工廠模式

  • 定義:工廠方法模式的升級版本,工廠方法模式只生產(chǎn)一個等級的產(chǎn)品,而抽象工廠模式可以生產(chǎn)多個等級的產(chǎn)品。
  • 使用場景:
  1. 系統(tǒng)中有多個產(chǎn)品族,每個具體工廠創(chuàng)建同一族但屬于不同等級結(jié)構(gòu)的產(chǎn)品
  2. 系統(tǒng)一次只可能消費其中某一族產(chǎn)品,即同組的產(chǎn)品一起使用
  • 優(yōu)點:
  1. 可以在類的內(nèi)部對產(chǎn)品族中相關(guān)聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進(jìn)行管理。
  2. 當(dāng)需要產(chǎn)品族時,抽象工廠可以保證客戶端始終只使用同一個產(chǎn)品的產(chǎn)品族
  3. 抽象工廠增強了程序的可擴展性,當(dāng)增加一個新的產(chǎn)品族時,不需要修改原代碼
  • 缺點:
    當(dāng)產(chǎn)品族中需要增加一個新的產(chǎn)品時,所有工廠類都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度
  • 模式的結(jié)構(gòu):

    同工廠方法模式一樣,但是抽象工廠中方法個數(shù)不同,抽象產(chǎn)品的個數(shù)也不同
    抽象工廠模式

建造者模式

  • 定義:指將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示。它是將一個復(fù)雜的對象分解為多個簡單的對象,然后一步一步構(gòu)建而成。
  • 優(yōu)點:
  1. 封裝性好,構(gòu)建和表示分離。
  2. 擴展性好,各個具體的建造者相互獨立,有利于系統(tǒng)的街耦
  3. 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),建造者可以對創(chuàng)建過程逐步細(xì)化,而不對其它模塊產(chǎn)生任何影響,便于控制細(xì)節(jié)風(fēng)險
  • 缺點:
  1. 產(chǎn)品的組成部分必須相同,這限制了其使用范圍
  2. 如果產(chǎn)品的內(nèi)部變化復(fù)雜,產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護(hù)成本較大。
  • 區(qū)別(與工廠模式):
  1. 建造者模式更加注重方法的調(diào)用順序,工廠模式注重創(chuàng)建對象。
  2. 創(chuàng)建對象的力度不同,建造者模式創(chuàng)建復(fù)雜的對象,由各種復(fù)雜的部件組成,工廠模式創(chuàng)建出來的對象都一樣
  3. 關(guān)注重點不一樣,工廠模式只需要把對象創(chuàng)建出來就可以了,而建造者模式不僅要創(chuàng)建出對象,還要知道對象由哪些部件組成。
  4. 建造者模式根據(jù)建造過程中的順序不一樣,最終對象部件組成也不一樣。
  • 模式的結(jié)構(gòu)
  1. 產(chǎn)品角色(Product):它是包含多個組成部件的復(fù)雜對象,由具體建造者來創(chuàng)建其各個零部件。
  2. 抽象建造者(Builder):它是一個包含創(chuàng)建產(chǎn)品各個子部件的抽象方法的接口,通常還包含一個返回復(fù)雜產(chǎn)品的方法 getResult()。
  3. 具體建造者(Concrete Builder):實現(xiàn) Builder 接口,完成復(fù)雜產(chǎn)品的各個部件的具體創(chuàng)建方法。
  4. 指揮者(Director):它調(diào)用建造者對象中的部件構(gòu)造與裝配方法完成復(fù)雜對象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。
  • 應(yīng)用場景:
  1. 相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的結(jié)果
  2. 多個部件或零件,都可以裝配到一個對象中,但是產(chǎn)生的結(jié)果又不相同。
  3. 初始化一個對象特別復(fù)雜,參數(shù)多,而且很多參數(shù)都具有默認(rèn)值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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