創(chuàng)建型模式:負(fù)責(zé)對(duì)象的創(chuàng)建。
工廠(chǎng)方法模式(Factory Method)摊腋;解決某個(gè)對(duì)象的創(chuàng)建工作。
抽象工廠(chǎng)模式(Abstract Factory): 解決一系列相互依賴(lài)對(duì)象的創(chuàng)建工作。
創(chuàng)建者模式(Builder):解決“一些復(fù)雜對(duì)象”的創(chuàng)建工作昏鹃。
原型模式(Prototype):解決某些結(jié)構(gòu)復(fù)雜的對(duì)象的創(chuàng)建工作。
單例模式(Singleton):解決了實(shí)體對(duì)象的個(gè)數(shù)問(wèn)題诀诊。
單例模式(SINGLETON)
單例對(duì)象的類(lèi)保證只有一個(gè)實(shí)例存在洞渤。
確保某個(gè)類(lèi)只有一個(gè)實(shí)例,向整個(gè)系統(tǒng)提供這個(gè)實(shí)例属瓣。
確保某個(gè)類(lèi)只有一個(gè)對(duì)象場(chǎng)景载迄,避免產(chǎn)生多個(gè)對(duì)象消耗過(guò)多的資源,或者某種類(lèi)型的對(duì)象因該有且只有一個(gè)抡蛙。
Client?:?高層客戶(hù)端护昧。
Singleton?:?單例類(lèi)。
常見(jiàn)的寫(xiě)法(線(xiàn)程不安全):
推薦的寫(xiě)法(線(xiàn)程安全粗截;延遲加載惋耙;效率較高):
雙重檢查:
靜態(tài)內(nèi)部類(lèi):
枚舉的寫(xiě)法:
Android不推薦枚舉,耗費(fèi)資源:
https://www.youtube.com/watch?t=32&v=Hzs6OBcvNQE
在Android項(xiàng)目里常用于生成View的LayoutInflater,就是單例的一種實(shí)現(xiàn)绽榛。
工廠(chǎng)方法模式是創(chuàng)建型設(shè)計(jì)模式之一?湿酸。
工廠(chǎng)方法模式定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)?灭美。
需要生成復(fù)雜對(duì)象的地方適合使用工廠(chǎng)模式推溃,用new就可以完成創(chuàng)建的對(duì)象無(wú)需使用工廠(chǎng)模式。?
Android源碼里的實(shí)現(xiàn):
Activity的onCreate就可以看作是一個(gè)工廠(chǎng)方法?届腐。?
減少內(nèi)存開(kāi)銷(xiāo)铁坎,提高性能。
每次添加新的產(chǎn)品就要編寫(xiě)一個(gè)新的產(chǎn)品類(lèi)犁苏,導(dǎo)致類(lèi)結(jié)構(gòu)的復(fù)雜化硬萍。
抽象工廠(chǎng)方法(ABSTRACT?FACTORY)
抽象工廠(chǎng)模式起源于以前對(duì)不同操作系統(tǒng)的圖形化解決方案,不同操作系統(tǒng)中的按鈕和文本控件實(shí)現(xiàn)不同傀顾,展示效果也不一樣襟铭。?
為創(chuàng)建一組相關(guān)或者是相互依賴(lài)的對(duì)象提供一個(gè)接口,而不需要指定它們的具體類(lèi)短曾。?
一個(gè)家族有相同的約束時(shí)可以使用抽象工廠(chǎng)模式寒砖。?
AbstractFactory?:?抽象工廠(chǎng)角色,聲明了一組用于創(chuàng)建一個(gè)產(chǎn)品的方法嫉拐,每個(gè)方法對(duì)應(yīng)一種產(chǎn)品哩都。
ConcreteFactory?:?具體工廠(chǎng)角色,實(shí)現(xiàn)了在抽象工廠(chǎng)中定義的創(chuàng)建產(chǎn)品的方法婉徘,生成一組具體產(chǎn)品漠嵌,產(chǎn)品構(gòu)成一個(gè)產(chǎn)品種類(lèi)。
AbstractProduct?:?抽象產(chǎn)品角色盖呼,為每種產(chǎn)品聲明接口儒鹿,比如圖中AbstractProductA和B
ConcreteProduct?:?具體產(chǎn)品角色,定義具體工廠(chǎng)生產(chǎn)的具體產(chǎn)品對(duì)象几晤,如圖中ConcreteProductA1,A2,B1和B2约炎。
Android里對(duì)MediaPlayer的創(chuàng)建。
分離接口和實(shí)現(xiàn)蟹瘾。
1.?類(lèi)文件爆炸性增加
2.?不容易擴(kuò)展新的產(chǎn)品類(lèi)圾浅,因?yàn)槊吭黾右粋€(gè)產(chǎn)品類(lèi)就需要修改抽象工廠(chǎng)。
工廠(chǎng)方法和抽象工廠(chǎng)的區(qū)別:
區(qū)別:工廠(chǎng)方法模式只有一個(gè)抽象產(chǎn)品類(lèi)憾朴,而抽象工廠(chǎng)模式有多個(gè)狸捕。 ??工廠(chǎng)方法模式的具體工廠(chǎng)類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)的實(shí)例众雷,而抽象工廠(chǎng)模式可以創(chuàng)建多個(gè)灸拍。
原型二字表明了該模式有一個(gè)樣板實(shí)例做祝,用戶(hù)從這個(gè)樣本實(shí)例中復(fù)制一個(gè)內(nèi)部屬性一致的對(duì)象,原型模式多用于創(chuàng)建復(fù)雜的或構(gòu)造耗時(shí)的實(shí)例株搔。?
原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi)剖淀,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。?
1.類(lèi)初始化需要消耗非常多的資源纤房,包括數(shù)據(jù),硬件資源等翻诉,通過(guò)原型拷貝避免消耗炮姨。
2.一個(gè)對(duì)象需要提供給其他對(duì)象訪(fǎng)問(wèn),各個(gè)調(diào)用者需要修改其值時(shí)碰煌,考慮原型模式拷貝或者多個(gè)對(duì)象供調(diào)用者使用舒岸,即保護(hù)性拷貝。?
UML圖:
Client?:?客戶(hù)端用戶(hù)芦圾。
Prototype?:?抽象類(lèi)或者接口蛾派,聲明具備clone能力。
ConcretePrototype?:?具體原型類(lèi)个少。
Intent的clone()方法洪乍。
原型模式是在內(nèi)存中二進(jìn)制流的拷貝,比直接new一個(gè)對(duì)象性能好很多夜焦,當(dāng)要在一個(gè)循環(huán)體內(nèi)產(chǎn)生大量的對(duì)象時(shí)壳澳,原型模式可以更好體現(xiàn)其優(yōu)點(diǎn)。
直接在內(nèi)存中拷貝時(shí)茫经,構(gòu)造器是不會(huì)執(zhí)行的巷波,優(yōu)點(diǎn)是減少了約束,缺點(diǎn)也是減少了約束卸伞。
Builder模式是一步一步創(chuàng)建一個(gè)復(fù)雜對(duì)象的創(chuàng)建型模式抹镊,它允許用戶(hù)在不知道內(nèi)部構(gòu)建細(xì)節(jié)的情況下,更精細(xì)的控制對(duì)象構(gòu)造流程荤傲。?
將一個(gè)復(fù)雜對(duì)象的構(gòu)建和它的表示分離垮耳,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。?
1.?初始化一個(gè)對(duì)象特別復(fù)雜弃酌,參數(shù)多氨菇,很多參數(shù)都有默認(rèn)值時(shí)。比如ImageLoader里的ImageLoaderConfig妓湘。
2.?類(lèi)非常復(fù)雜查蓉,產(chǎn)品類(lèi)中的調(diào)用順序不同產(chǎn)生了不同的作用,這個(gè)時(shí)候使用建造者模式非常適合榜贴。?
Product?:?產(chǎn)品的抽象類(lèi)豌研。
Builder?:?抽象Builder類(lèi)妹田,規(guī)范產(chǎn)品的組建,一般是子類(lèi)實(shí)現(xiàn)具體的組建過(guò)程鹃共。
ConcreteBuilder?:?具體的Builder類(lèi)鬼佣。
Director?:?統(tǒng)一組裝過(guò)程。
WindowManager
1.?良好的封裝性霜浴,使用建造者模式可以使客戶(hù)端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)晶衷。
2.?建造者獨(dú)立,容易擴(kuò)展阴孟。
會(huì)產(chǎn)生多余的Builder對(duì)象和Director對(duì)象晌纫,消耗內(nèi)存。