設計模式-面相對象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 個特點:
- 單例類只有一個實例對象;
- 該單例對象必須由單例類自行創(chuàng)建肪虎;
- 單例類對外提供一個訪問該單例的全局訪問點劣砍;
單例模式的結構與實現(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. 模式的結構
原型模式包含以下主要角色撵摆。
- 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口底靠。
- 具體原型類:實現(xiàn)抽象原型類的 clone() 方法,它是可被復制的對象特铝。
- 訪問類:使用具體原型類中的 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. 模式的結構
工廠方法模式的主要角色如下篮撑。
- 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調用者通過它訪問具體工廠的工廠方法 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)建左冬,它同具體工廠之間一一對應桐筏。
其結構圖如圖 1 所示。
抽象工廠模式
前面介紹的工廠方法模式中考慮的是一類產(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)的電視機與空調對應的關系圖性含。
圖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. 模式的結構
抽象工廠模式的主要角色如下邪媳。
- 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個不同等級的產(chǎn)品雨效。
- 具體工廠(Concrete Factory):主要是實現(xiàn)抽象工廠中的多個抽象方法迅涮,完成具體產(chǎn)品的創(chuàng)建。
- 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范徽龟,描述了產(chǎn)品的主要特性和功能叮姑,抽象工廠模式有多個抽象產(chǎn)品。
- 具體產(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)點如下:
- 各個具體的建造者相互獨立弧腥,有利于系統(tǒng)的擴展厦取。
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),便于控制細節(jié)風險管搪。
其缺點如下:
- 產(chǎn)品的組成部分必須相同虾攻,這限制了其使用范圍。
- 如果產(chǎn)品的內(nèi)部變化復雜抛蚤,該模式會增加很多的建造者類台谢。
建造者(Builder)模式和工廠模式的關注點不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創(chuàng)建過程岁经,但兩者可以結合使用朋沮。
模式的結構與實現(xiàn)
建造者(Builder)模式由產(chǎn)品、抽象建造者缀壤、具體建造者樊拓、指揮者等 4 個要素構成,現(xiàn)在我們來分析其基本結構和實現(xiàn)方法塘慕。
1. 模式的結構
建造者(Builder)模式的主要角色如下筋夏。
- 產(chǎn)品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創(chuàng)建其各個滅部件图呢。
- 抽象建造者(Builder):它是一個包含創(chuàng)建產(chǎn)品各個子部件的抽象方法的接口条篷,通常還包含一個返回復雜產(chǎn)品的方法 getResult()骗随。
- 具體建造者(Concrete Builder):實現(xiàn) Builder 接口,完成復雜產(chǎn)品的各個部件的具體創(chuàng)建方法赴叹。
- 指揮者(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 所示。