設(shè)計模式-創(chuàng)造性模式 單例 原型 工廠 建造者

設(shè)計模式-面相對象5個原則
設(shè)計模式-創(chuàng)造性模式 單例 原型 工廠 建造者
設(shè)計模式-設(shè)計模式 - 結(jié)構(gòu)性模式 代理 適配器 橋接 裝飾 外觀 享元 組合
設(shè)計模式-行為性模式
采用自出處http://c.biancheng.net/view/1326.html
創(chuàng)建型模式的主要關(guān)注點是“怎樣創(chuàng)建對象?”,它的主要特點是“將對象的創(chuàng)建與使用分離”。這樣可以降低系統(tǒng)的耦合度,使用者不需要關(guān)注對象的創(chuàng)建細(xì)節(jié),對象的創(chuàng)建由相關(guān)的工廠來完成。就像我們?nèi)ド虉鲑徺I商品時,不需要知道商品是怎么生產(chǎn)出來一樣,因為它們由專門的廠商生產(chǎn)。

創(chuàng)建型模式分為以下幾種。

  • 單例(Singleton)模式:某個類只能生成一個實例,該類提供了一個全局訪問點供外部獲取該實例,其拓展是有限多例模式。
  • 原型(Prototype)模式:將一個對象作為原型,通過對其進行復(fù)制而克隆出多個和原型類似的新實例。
  • 工廠方法(FactoryMethod)模式:定義一個用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品。
  • 抽象工廠(AbstractFactory)模式:提供一個創(chuàng)建產(chǎn)品族的接口,其每個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。
  • 建造者(Builder)模式:將一個復(fù)雜對象分解成多個相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。

以上 5 種創(chuàng)建型模式,除了工廠方法模式屬于類創(chuàng)建型模式,其他的全部屬于對象創(chuàng)建型模式,我們將在之后的教程中詳細(xì)地介紹它們的特點、結(jié)構(gòu)與應(yīng)用。

1.單例模式

在有些系統(tǒng)中,為了節(jié)省內(nèi)存資源、保證數(shù)據(jù)內(nèi)容的一致性,對某些類要求只能創(chuàng)建一個實例,這就是所謂的單例模式。

單例模式的定義與特點

單例(Singleton)模式的定義:指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式。例如,Windows 中只能打開一個任務(wù)管理器,這樣可以避免因打開多個任務(wù)管理器窗口而造成內(nèi)存資源的浪費,或出現(xiàn)各個窗口顯示內(nèi)容的不一致等錯誤。

在計算機系統(tǒng)中,還有 Windows 的回收站、操作系統(tǒng)中的文件系統(tǒng)、多線程中的線程池、顯卡的驅(qū)動程序?qū)ο?、打印機的后臺處理服務(wù)、應(yīng)用程序的日志對象、數(shù)據(jù)庫的連接池、網(wǎng)站的計數(shù)器、Web 應(yīng)用的配置對象、應(yīng)用程序中的對話框、系統(tǒng)中的緩存等常常被設(shè)計成單例。

單例模式有 3 個特點:

  1. 單例類只有一個實例對象;
  2. 該單例對象必須由單例類自行創(chuàng)建;
  3. 單例類對外提供一個訪問該單例的全局訪問點;

單例模式的結(jié)構(gòu)與實現(xiàn)

單例模式是設(shè)計模式中最簡單的模式之一。通常,普通類的構(gòu)造函數(shù)是公有的,外部類可以通過“new 構(gòu)造函數(shù)()”來生成多個實例。但是,如果將類的構(gòu)造函數(shù)設(shè)為私有的,外部類就無法調(diào)用該構(gòu)造函數(shù),也就無法生成多個實例。這時該類自身必須定義一個靜態(tài)私有實例,并向外提供一個靜態(tài)的公有函數(shù)用于創(chuàng)建或獲取該靜態(tài)私有實例。

原型設(shè)計模式

在有些系統(tǒng)中,存在大量相同或相似對象的創(chuàng)建問題,如果用傳統(tǒng)的構(gòu)造函數(shù)來創(chuàng)建對象,會比較復(fù)雜且耗時耗資源,用原型模式生成對象就很高效,就像孫悟空拔下猴毛輕輕一吹就變出很多孫悟空一樣簡單。

原型模式的定義與特點

原型(Prototype)模式的定義如下:用一個已經(jīng)創(chuàng)建的實例作為原型,通過復(fù)制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實例指定了要創(chuàng)建的對象的種類。用這種方式創(chuàng)建對象非常高效,根本無須知道對象創(chuàng)建的細(xì)節(jié)。例如,Windows 操作系統(tǒng)的安裝通常較耗時,如果復(fù)制就快了很多。在生活中復(fù)制的例子非常多,這里不一一列舉了。

原型模式的結(jié)構(gòu)與實現(xiàn)

由于 Java 提供了對象的 clone() 方法,所以用 Java 實現(xiàn)原型模式很簡單。

1. 模式的結(jié)構(gòu)

原型模式包含以下主要角色。

  1. 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口。
  2. 具體原型類:實現(xiàn)抽象原型類的 clone() 方法,它是可被復(fù)制的對象。
  3. 訪問類:使用具體原型類中的 clone() 方法來復(fù)制新的對象。

工廠模式

在現(xiàn)實生活中社會分工越來越細(xì),越來越專業(yè)化。各種產(chǎn)品有專門的工廠生產(chǎn),徹底告別了自給自足的小農(nóng)經(jīng)濟時代,這大大縮短了產(chǎn)品的生產(chǎn)周期,提高了生產(chǎn)效率。同樣,在軟件開發(fā)中能否做到軟件對象的生產(chǎn)和使用相分離呢?能否在滿足“開閉原則”的前提下,客戶隨意增刪或改變對軟件相關(guān)對象的使用呢?這就是本節(jié)要討論的問題。

模式的定義與特點

工廠方法(FactoryMethod)模式的定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當(dāng)中。這滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點。

我們把被創(chuàng)建的對象稱為“產(chǎn)品”,把創(chuàng)建產(chǎn)品的對象稱為“工廠”。如果要創(chuàng)建的產(chǎn)品不多,只要一個工廠類就可以完成,這種模式叫“簡單工廠模式”,它不屬于 GoF 的 23 種經(jīng)典設(shè)計模式,它的缺點是增加新產(chǎn)品時會違背“開閉原則”。

本節(jié)介紹的“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統(tǒng)在不修改原來代碼的情況下引進新的產(chǎn)品,即滿足開閉原則。

工廠方法模式的主要優(yōu)點有:

  • 用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的具體創(chuàng)建過程;
  • 在系統(tǒng)增加新的產(chǎn)品時只需要添加具體產(chǎn)品類和對應(yīng)的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則;

其缺點是:每增加一個產(chǎn)品就要增加一個具體產(chǎn)品類和一個對應(yīng)的具體工廠類,這增加了系統(tǒng)的復(fù)雜度。

模式的結(jié)構(gòu)與實現(xiàn)

工廠方法模式由抽象工廠、具體工廠、抽象產(chǎn)品和具體產(chǎn)品等4個要素構(gòu)成。本節(jié)來分析其基本結(jié)構(gòu)和實現(xiàn)方法。

1. 模式的結(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)。

其結(jié)構(gòu)圖如圖 1 所示。


image.png

抽象工廠模式

前面介紹的工廠方法模式中考慮的是一類產(chǎn)品的生產(chǎn),如畜牧場只養(yǎng)動物、電視機廠只生產(chǎn)電視機、計算機軟件學(xué)院只培養(yǎng)計算機軟件專業(yè)的學(xué)生等。

同種類稱為同等級,也就是說:工廠方法模式只考慮生產(chǎn)同等級的產(chǎn)品,但是在現(xiàn)實生活中許多工廠是綜合型的工廠,能生產(chǎn)多等級(種類) 的產(chǎn)品,如農(nóng)場里既養(yǎng)動物又種植物,電器廠既生產(chǎn)電視機又生產(chǎn)洗衣機或空調(diào),大學(xué)既有軟件專業(yè)又有生物專業(yè)等。

本節(jié)要介紹的抽象工廠模式將考慮多等級產(chǎn)品的生產(chǎn),將同一個具體工廠所生產(chǎn)的位于不同等級的一組產(chǎn)品稱為一個產(chǎn)品族,圖 1 所示的是海爾工廠和 TCL 工廠所生產(chǎn)的電視機與空調(diào)對應(yīng)的關(guān)系圖。

電器工廠的產(chǎn)品等級與產(chǎn)品族

圖1 電器工廠的產(chǎn)品等級與產(chǎn)品族

模式的定義與特點

抽象工廠(AbstractFactory)模式的定義:是一種為訪問類提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的不同等級的產(chǎn)品的模式結(jié)構(gòu)。

抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產(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)點外,其他主要優(yōu)點如下。

  • 可以在類的內(nèi)部對產(chǎn)品族中相關(guān)聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進行管理。
  • 當(dāng)增加一個新的產(chǎn)品族時不需要修改原代碼,滿足開閉原則。

其缺點是:當(dāng)產(chǎn)品族中需要增加一個新的產(chǎn)品時,所有的工廠類都需要進行修改。

模式的結(jié)構(gòu)與實現(xiàn)

抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產(chǎn)品和具體產(chǎn)品等 4 個要素構(gòu)成,但抽象工廠中方法個數(shù)不同,抽象產(chǎn)品的個數(shù)也不同?,F(xiàn)在我們來分析其基本結(jié)構(gòu)和實現(xiàn)方法。

1. 模式的結(jié)構(gòu)

抽象工廠模式的主要角色如下。

  1. 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個不同等級的產(chǎn)品。
  2. 具體工廠(Concrete Factory):主要是實現(xiàn)抽象工廠中的多個抽象方法,完成具體產(chǎn)品的創(chuàng)建。
  3. 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個抽象產(chǎn)品。
  4. 具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它 同具體工廠之間是多對一的關(guān)系。

抽象工廠模式的結(jié)構(gòu)圖如圖 2 所示。

抽象工廠模式的結(jié)構(gòu)圖

建造者模式

在軟件開發(fā)過程中有時需要創(chuàng)建一個復(fù)雜的對象,這個復(fù)雜對象通常由多個子部件按一定的步驟組合而成。例如,計算機是由 OPU、主板、內(nèi)存、硬盤、顯卡、機箱、顯示器、鍵盤、鼠標(biāo)等部件組裝而成的,采購員不可能自己去組裝計算機,而是將計算機的配置要求告訴計算機銷售公司,計算機銷售公司安排技術(shù)人員去組裝計算機,然后再交給要買計算機的采購員。

生活中這樣的例子很多,如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發(fā)型等特性都有所差異;還有汽車中的方向盤、發(fā)動機、車架、輪胎等部件也多種多樣;每封電子郵件的發(fā)件人、收件人、主題、內(nèi)容、附件等內(nèi)容也各不相同。

以上所有這些產(chǎn)品都是由多個部件構(gòu)成的,各個部件可以靈活選擇,但其創(chuàng)建步驟都大同小異。這類產(chǎn)品的創(chuàng)建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產(chǎn)品的創(chuàng)建。

模式的定義與特點

建造者(Builder)模式的定義:指將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計模式被稱為建造者模式。它是將一個復(fù)雜的對象分解為多個簡單的對象,然后一步一步構(gòu)建而成。它將變與不變相分離,即產(chǎn)品的組成部分是不變的,但每一部分是可以靈活選擇的。

該模式的主要優(yōu)點如下:

  1. 各個具體的建造者相互獨立,有利于系統(tǒng)的擴展。
  2. 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),便于控制細(xì)節(jié)風(fēng)險。

其缺點如下:

  1. 產(chǎn)品的組成部分必須相同,這限制了其使用范圍。
  2. 如果產(chǎn)品的內(nèi)部變化復(fù)雜,該模式會增加很多的建造者類。

建造者(Builder)模式和工廠模式的關(guān)注點不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創(chuàng)建過程,但兩者可以結(jié)合使用。

模式的結(jié)構(gòu)與實現(xiàn)

建造者(Builder)模式由產(chǎn)品、抽象建造者、具體建造者、指揮者等 4 個要素構(gòu)成,現(xiàn)在我們來分析其基本結(jié)構(gòu)和實現(xiàn)方法。

1. 模式的結(jié)構(gòu)

建造者(Builder)模式的主要角色如下。

  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)品的信息。

其結(jié)構(gòu)圖如圖 1 所示。

建造者模式的結(jié)構(gòu)圖

模式的應(yīng)用實例

【例1】用建造者(Builder)模式描述客廳裝修。

分析:客廳裝修是一個復(fù)雜的過程,它包含墻體的裝修、電視機的選擇、沙發(fā)的購買與布局等??蛻舭蜒b修要求告訴項目經(jīng)理,項目經(jīng)理指揮裝修工人一步步裝修,最后完成整個客廳的裝修與布局,所以本實例用建造者模式實現(xiàn)比較適合。

這里客廳是產(chǎn)品,包括墻、電視和沙發(fā)等組成部分。具體裝修工人是具體建造者,他們負(fù)責(zé)裝修與墻、電視和沙發(fā)的布局。項目經(jīng)理是指揮者,他負(fù)責(zé)指揮裝修工人進行裝修。

另外,客廳類中提供了 show() 方法,可以將裝修效果圖顯示出來(點此下載裝修效果圖的圖片)。客戶端程序通過對象生成器類 ReadXML 讀取 XML 配置文件中的裝修方案數(shù)據(jù)(點此下載 XML 文件),調(diào)用項目經(jīng)理進行裝修。其類圖如圖 2 所示。

客廳裝修的結(jié)構(gòu)圖
最后編輯于
?著作權(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ù)。

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