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

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

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

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

以上 5 種創(chuàng)建型模式铐望,除了工廠方法模式屬于類創(chuàng)建型模式,其他的全部屬于對象創(chuàng)建型模式茂附,我們將在之后的教程中詳細地介紹它們的特點正蛙、結構與應用。

1.單例模式

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

單例模式的定義與特點

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

在計算機系統(tǒng)中,還有 Windows 的回收站响委、操作系統(tǒng)中的文件系統(tǒng)新思、多線程中的線程池、顯卡的驅動程序對象赘风、打印機的后臺處理服務夹囚、應用程序的日志對象、數(shù)據(jù)庫的連接池邀窃、網(wǎng)站的計數(shù)器荸哟、Web 應用的配置對象、應用程序中的對話框瞬捕、系統(tǒng)中的緩存等常常被設計成單例鞍历。

單例模式有 3 個特點:

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

單例模式的結構與實現(xiàn)

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

原型設計模式

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

原型模式的定義與特點

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

原型模式的結構與實現(xiàn)

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

1. 模式的結構

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

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

工廠模式

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

模式的定義與特點

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

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

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

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

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

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

模式的結構與實現(xiàn)

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

1. 模式的結構

工廠方法模式的主要角色如下篮撑。

  1. 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調用者通過它訪問具體工廠的工廠方法 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)建左冬,它同具體工廠之間一一對應桐筏。

其結構圖如圖 1 所示。


image.png

抽象工廠模式

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

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

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

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

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

模式的定義與特點

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

抽象工廠模式是工廠方法模式的升級版本商蕴,工廠方法模式只生產(chǎn)一個等級的產(chǎn)品板鬓,而抽象工廠模式可生產(chǎn)多個等級的產(chǎn)品。

使用抽象工廠模式一般要滿足以下條件究恤。

  • 系統(tǒng)中有多個產(chǎn)品族俭令,每個具體工廠創(chuàng)建同一族但屬于不同等級結構的產(chǎn)品。
  • 系統(tǒng)一次只可能消費其中某一族產(chǎn)品部宿,即同族的產(chǎn)品一起使用抄腔。

抽象工廠模式除了具有工廠方法模式的優(yōu)點外萄焦,其他主要優(yōu)點如下诵叁。

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

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

模式的結構與實現(xiàn)

抽象工廠模式同工廠方法模式一樣织狐,也是由抽象工廠暂幼、具體工廠、抽象產(chǎn)品和具體產(chǎn)品等 4 個要素構成移迫,但抽象工廠中方法個數(shù)不同旺嬉,抽象產(chǎn)品的個數(shù)也不同。現(xiàn)在我們來分析其基本結構和實現(xiàn)方法厨埋。

1. 模式的結構

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

  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)建戏溺,它 同具體工廠之間是多對一的關系渣蜗。

抽象工廠模式的結構圖如圖 2 所示屠尊。

抽象工廠模式的結構圖

建造者模式

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

生活中這樣的例子很多稻扬,如游戲中的不同角色卦方,其性別、個性泰佳、能力盼砍、臉型、體型逝她、服裝衬廷、發(fā)型等特性都有所差異;還有汽車中的方向盤汽绢、發(fā)動機吗跋、車架、輪胎等部件也多種多樣;每封電子郵件的發(fā)件人跌宛、收件人酗宋、主題、內(nèi)容疆拘、附件等內(nèi)容也各不相同蜕猫。

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

模式的定義與特點

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

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

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

其缺點如下:

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

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

模式的結構與實現(xiàn)

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

1. 模式的結構

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

  1. 產(chǎn)品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創(chuàng)建其各個滅部件图呢。
  2. 抽象建造者(Builder):它是一個包含創(chuàng)建產(chǎn)品各個子部件的抽象方法的接口条篷,通常還包含一個返回復雜產(chǎn)品的方法 getResult()骗随。
  3. 具體建造者(Concrete Builder):實現(xiàn) Builder 接口,完成復雜產(chǎn)品的各個部件的具體創(chuàng)建方法赴叹。
  4. 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成復雜對象的創(chuàng)建鸿染,在指揮者中不涉及具體產(chǎn)品的信息。

其結構圖如圖 1 所示乞巧。

建造者模式的結構圖

模式的應用實例

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

分析:客廳裝修是一個復雜的過程,它包含墻體的裝修绽媒、電視機的選擇蚕冬、沙發(fā)的購買與布局等∈窃客戶把裝修要求告訴項目經(jīng)理囤热,項目經(jīng)理指揮裝修工人一步步裝修,最后完成整個客廳的裝修與布局免糕,所以本實例用建造者模式實現(xiàn)比較適合赢乓。

這里客廳是產(chǎn)品忧侧,包括墻石窑、電視和沙發(fā)等組成部分。具體裝修工人是具體建造者蚓炬,他們負責裝修與墻松逊、電視和沙發(fā)的布局。項目經(jīng)理是指揮者肯夏,他負責指揮裝修工人進行裝修经宏。

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

客廳裝修的結構圖
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暇矫,一起剝皮案震驚了整個濱河市主之,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌李根,老刑警劉巖槽奕,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異房轿,居然都是意外死亡粤攒,警方通過查閱死者的電腦和手機所森,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夯接,“玉大人必峰,你說我怎么就攤上這事∽甑牛” “怎么了吼蚁?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長问欠。 經(jīng)常有香客問我肝匆,道長,這世上最難降的妖魔是什么顺献? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任旗国,我火速辦了婚禮,結果婚禮上注整,老公的妹妹穿的比我還像新娘能曾。我一直安慰自己,他們只是感情好肿轨,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布寿冕。 她就那樣靜靜地躺著,像睡著了一般椒袍。 火紅的嫁衣襯著肌膚如雪驼唱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天驹暑,我揣著相機與錄音玫恳,去河邊找鬼。 笑死优俘,一個胖子當著我的面吹牛京办,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帆焕,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼惭婿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了视搏?” 一聲冷哼從身側響起审孽,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浑娜,沒想到半個月后佑力,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡筋遭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年打颤,在試婚紗的時候發(fā)現(xiàn)自己被綠了暴拄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡编饺,死狀恐怖乖篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情透且,我是刑警寧澤撕蔼,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站秽誊,受9級特大地震影響鲸沮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜锅论,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一讼溺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧最易,春花似錦怒坯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至束析,卻和暖如春艳馒,著一層夾襖步出監(jiān)牢的瞬間憎亚,已是汗流浹背员寇。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留第美,地道東北人蝶锋。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像什往,于是被迫代替她去往敵國和親扳缕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361