參考網(wǎng)站:設(shè)計模式
創(chuàng)建型模式
| 單例模式 | 原型模式 | 工廠方法模式 | 抽象工廠方法模式 | 建造者模式 |
|---|
單例模式
- 定義:指一個類只能有一個實例,且該類能自行創(chuàng)建這個實例的一種模式。例如,Windows中只能打開一個任務(wù)管理器,這樣可以避免因打開多個任務(wù)管理器窗口而造成資源的浪費,或出現(xiàn)各個窗口顯示內(nèi)容的不一致等錯誤。
- 3個特點:
- 單例類只有一個對象
- 該單例對象必須由單例類自行創(chuàng)建
- 單例類對外提供一個訪問該單例的全局訪問點
- 優(yōu)點:
- 單例模式可以保證內(nèi)存里只有一個實例,減少了內(nèi)存的開銷。
- 可以避免對資源的多重占用
- 單例模式設(shè)置全局訪問點,可以優(yōu)化和共享資源的訪問。
- 缺點:
- 單例模式一般沒有接口,擴展困難。如果要擴展,則除了修改原來的代碼,沒有第二種途徑。
- 在并發(fā)測試中,單例模式不利于代碼調(diào)優(yōu)。在調(diào)試過程中,如果單例中的代碼沒有執(zhí)行完,也不能模擬生成一個新的對象。
- 單例模式的功能代碼通常寫在一個類中,如果功能設(shè)計不合理,則很容易違背單一職責(zé)的原則。
- 應(yīng)用場景
- 需要頻繁創(chuàng)建的一些類,使用單例可以降低系統(tǒng)的內(nèi)存壓力,減少GC。
- 某類只要求生成一個對象的時候。
- 某些類創(chuàng)建實例時占用資源較多,或?qū)嵗臅r較長,且經(jīng)常使用。
- 頻繁訪問數(shù)據(jù)庫或文件的對象。(只建立一次連接)
- 對于一些控制硬件級別的操作,或者從系統(tǒng)上講應(yīng)當(dāng)是單一控制邏輯的操作,如果有多個實例,則系統(tǒng)會完全亂套。
- 當(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)原型模式很簡單。
原型模式包含以下主要角色:- 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口
- 具體原型類:實現(xiàn)抽象原型類中的clone()方法,它是可被復(fù)制的對象
- 訪問類:使用具體原型類中的clone()方法來復(fù)制新的對象
- 模式的實現(xiàn):
原型模式的克隆分為淺克隆和深克隆- 淺克?。簞?chuàng)建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內(nèi)存地址
- 深克?。簞?chuàng)建一個新對象,屬性中引用的其他對象也會被克隆,不再指向原有對象地址。
- 應(yīng)用場景:
- 對象之間相同或相似,即只是個別屬性不同的時候
- 創(chuàng)建對象成本較大,例如初始化時間太長,占用CPU太多,或者占用網(wǎng)絡(luò)資源太多等,需要優(yōu)化資源
- 創(chuàng)建一個對象需要繁瑣的數(shù)據(jù)準(zhǔn)備和訪問權(quán)限等,需要提高性能或者提高安全性
- 系統(tǒng)中大量使用該類對象,且各個調(diào)用者都需要給它重新賦值
簡單(靜態(tài))工廠模式
- 工廠模式定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當(dāng)中。
- 簡單工廠模式:有一個具體的工廠類,可以生成多個不同的產(chǎn)品。
- 優(yōu)點:
- 工廠類包含必要的邏輯判斷,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品的實例。客戶端可以免除直接創(chuàng)建產(chǎn)品對象的職責(zé),很方便地創(chuàng)建出相應(yīng)的產(chǎn)品。工廠和產(chǎn)品的職責(zé)區(qū)分明確。
- 客戶端無需知道所創(chuàng)建具體產(chǎn)品的類名,只需要知道參數(shù)即可。
- 也可以引入配置文件,在不修改客戶端代碼的情況下更換和添加新的具體產(chǎn)品類。
- 缺點:
- 簡單工廠模式的工廠類單一,負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,職責(zé)過重,一旦異常,整個系統(tǒng)將受影響。且工廠類代碼會非常臃腫,違背高聚合原則。
- 使用簡單工廠模式會增加系統(tǒng)中類的個數(shù)(引入新的工廠類),增加系統(tǒng)的復(fù)雜度和理解難度。
- 系統(tǒng)擴展困難,一旦增加新產(chǎn)品不得不修改工廠邏輯,在產(chǎn)品類型較多時,可能造成邏輯過于復(fù)雜
- 簡單工廠模式使用static工廠方法,造成工廠角色無法形成基于繼承的等級結(jié)構(gòu)。
- 應(yīng)用場景:
對于產(chǎn)品種類相對較少的情況,考慮使用簡單工廠模式。使用簡單工廠模式的客戶端只需要傳入工廠類的參數(shù),不需要關(guān)心如何創(chuàng)建對象的邏輯,可以很方便地創(chuàng)建所需產(chǎn)品。 - 模式的結(jié)構(gòu):
- 簡單工廠(SimpleFactory):是簡單工廠模式的核心,負(fù)責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象。
- 抽象產(chǎn)品(Product):是簡單工廠創(chuàng)建的所有對象的父類,負(fù)責(zé)描述所有實例共有的公共接口。
- 具體產(chǎn)品(ConcreteProduct):是簡單工廠模式的創(chuàng)建目標(biāo)。
工廠方法模式
- 優(yōu)點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的具體創(chuàng)建過程。
- 靈活性增強,對于新產(chǎn)品的創(chuàng)建,只需多寫一個相應(yīng)的工廠類。
- 高層模塊只需要知道產(chǎn)品的抽象類,無須關(guān)心其他實現(xiàn)類。
- 缺點:
- 類的個數(shù)容易過多,增加復(fù)雜度
- 增加了系統(tǒng)的抽象性和理解難度
- 抽象產(chǎn)品只能生產(chǎn)一種產(chǎn)品,此弊端可以使用抽象工廠模式解決
- 應(yīng)用場景:
- 客戶只知道創(chuàng)建產(chǎn)品的工廠名,而不知道具體的產(chǎn)品名。
- 創(chuàng)建對象的任務(wù)由多個具體子工廠中的某一個完成,而抽象工廠只提供創(chuàng)建產(chǎn)品的接口。
- 客戶不關(guān)心創(chuàng)建產(chǎn)品的細(xì)節(jié),只關(guān)心產(chǎn)品的品牌
- 模式的結(jié)構(gòu)
- 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法 newProduct() 來創(chuàng)建產(chǎn)品。
- 具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
- 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
-
具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。工廠方法模式
抽象工廠模式
- 定義:工廠方法模式的升級版本,工廠方法模式只生產(chǎn)一個等級的產(chǎn)品,而抽象工廠模式可以生產(chǎn)多個等級的產(chǎn)品。
- 使用場景:
- 系統(tǒng)中有多個產(chǎn)品族,每個具體工廠創(chuàng)建同一族但屬于不同等級結(jié)構(gòu)的產(chǎn)品
- 系統(tǒng)一次只可能消費其中某一族產(chǎn)品,即同組的產(chǎn)品一起使用
- 優(yōu)點:
- 可以在類的內(nèi)部對產(chǎn)品族中相關(guān)聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進(jìn)行管理。
- 當(dāng)需要產(chǎn)品族時,抽象工廠可以保證客戶端始終只使用同一個產(chǎn)品的產(chǎn)品族
- 抽象工廠增強了程序的可擴展性,當(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)點:
- 封裝性好,構(gòu)建和表示分離。
- 擴展性好,各個具體的建造者相互獨立,有利于系統(tǒng)的街耦
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),建造者可以對創(chuàng)建過程逐步細(xì)化,而不對其它模塊產(chǎn)生任何影響,便于控制細(xì)節(jié)風(fēng)險
- 缺點:
- 產(chǎn)品的組成部分必須相同,這限制了其使用范圍
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜,產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護(hù)成本較大。
- 區(qū)別(與工廠模式):
- 建造者模式更加注重方法的調(diào)用順序,工廠模式注重創(chuàng)建對象。
- 創(chuàng)建對象的力度不同,建造者模式創(chuàng)建復(fù)雜的對象,由各種復(fù)雜的部件組成,工廠模式創(chuàng)建出來的對象都一樣
- 關(guān)注重點不一樣,工廠模式只需要把對象創(chuàng)建出來就可以了,而建造者模式不僅要創(chuàng)建出對象,還要知道對象由哪些部件組成。
- 建造者模式根據(jù)建造過程中的順序不一樣,最終對象部件組成也不一樣。
- 模式的結(jié)構(gòu)
- 產(chǎn)品角色(Product):它是包含多個組成部件的復(fù)雜對象,由具體建造者來創(chuàng)建其各個零部件。
- 抽象建造者(Builder):它是一個包含創(chuàng)建產(chǎn)品各個子部件的抽象方法的接口,通常還包含一個返回復(fù)雜產(chǎn)品的方法 getResult()。
- 具體建造者(Concrete Builder):實現(xiàn) Builder 接口,完成復(fù)雜產(chǎn)品的各個部件的具體創(chuàng)建方法。
- 指揮者(Director):它調(diào)用建造者對象中的部件構(gòu)造與裝配方法完成復(fù)雜對象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。
- 應(yīng)用場景:
- 相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的結(jié)果
- 多個部件或零件,都可以裝配到一個對象中,但是產(chǎn)生的結(jié)果又不相同。
- 初始化一個對象特別復(fù)雜,參數(shù)多,而且很多參數(shù)都具有默認(rèn)值

