設(shè)計(jì)模式之禪——設(shè)計(jì)模式(一)

單例模式

summary
1劣纲、只有一個實(shí)例
2、整個系統(tǒng)共用這個實(shí)例

餓漢模式

public class Singleton{
private static final Singleton singleton =new Singleton();
//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
return singleton;
}
//類中的其他方法谁鳍,盡量 static
public static void doSomething(){
}
}

懶漢模式
用的時候癞季,創(chuàng)建實(shí)例劫瞳。高并發(fā)的時候,需要在方法前添加synchronize绷柒;

public class Singleton{
private static final Singleton singleton =null;
//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
if(singleton==null){
singleton =new Singleton();
}
return singleton;
}
//類中的其他方法志于,盡量 static
public static void doSomething(){
}
}

優(yōu)點(diǎn)

1、唯一實(shí)例废睦,避免多次創(chuàng)建伺绽,減小內(nèi)存使用。
2嗜湃、全局共享唯一資源奈应,調(diào)度,管理方便购披。
3杖挣、加鎖后,防止資源文件的同時讀寫刚陡。

缺點(diǎn)

1惩妇、擴(kuò)展困難,需要擴(kuò)展么筐乳?屿附?
2、違背單一職責(zé)原則哥童,單例的實(shí)例一般是一個混合型的靜態(tài)類。
3褒翰、“單例模式對測試是不利的贮懈。在并行開發(fā)環(huán)境中,如果單例模式?jīng)]有完成优训,是不能進(jìn)行測試的朵你,沒有接口也不能使用mock的方式虛擬一個對象〈Х牵”

摘錄來自: 秦小波. “設(shè)計(jì)模式之禪(第2版)”抡医。

擴(kuò)展:多例模式

利用一個list進(jìn)行實(shí)例管理,考慮到同步問題早敬,可以采用vector忌傻;

public class Singleton{
private static int maxNumber =2;
private static List<Singleton> singletonList =new ArrayList<>();
private static final Singleton singleton =null;

static{
  for(int i =0;i<maxNumber;i++){
  singletonList.add(new Singleton() );
  }
}


//限制產(chǎn)生多個對象
private Singleton(){
}
//獲得實(shí)例的方法
public static Singleton getInstance(){
Random random = new Random();
return singletonList.get(random.nextInt(maxNumber));
}
//類中的其他方法,盡量 static
public static void doSomething(){
}
}

2.工廠方法模式

  • 定義一個用于創(chuàng)建對象的接口搞监,具體實(shí)現(xiàn)類由他的子類決定水孩。工廠方法使一個類的實(shí)例化延遲到其子類。

優(yōu)點(diǎn)

  • 良好的封裝性琐驴,代碼結(jié)構(gòu)清晰俘种。
  • 擴(kuò)展性非常優(yōu)秀秤标,適配新情況,原來的工廠類基本不用修改宙刘。
  • 屏蔽產(chǎn)品類苍姜。實(shí)例是在工廠類中實(shí)現(xiàn)的,由工廠類負(fù)責(zé)悬包。
  • 工廠模式是典型的解耦合框架衙猪。


    image.png

擴(kuò)展

2.1簡單工程模式(靜態(tài)工廠模式)
  • 去掉工廠模式里的抽象類,將方法改成靜態(tài)方法玉罐。調(diào)用的話變得簡單方便屈嗤。
  • 缺點(diǎn)擴(kuò)展比較困難?吊输?饶号,不符合開閉原則?季蚂?
2.2多個工程模式
  • 由原來一個工廠變成多個工廠茫船,同時,每個工廠實(shí)現(xiàn)的方法可以進(jìn)行具體化扭屁。
  • 當(dāng)工廠種類比較多的時候算谈,代碼比較龐大。
2.3工廠模式實(shí)現(xiàn)單例式(針對惡漢模式)
  • 不通過正常手段實(shí)現(xiàn)實(shí)例料滥,通過添加一個static代碼塊然眼。并采用反射的方法來創(chuàng)建實(shí)例。(跟工廠有毛線關(guān)系葵腹?高每?)
//靜態(tài)代碼塊
 private static Singleton singleton;
 
static{
try{
Class cl =Class.forName(Singleton.class.getName());
//獲得無參構(gòu)造
Constructor constructor  =cl.getDeclaredConstructor();
//設(shè)置無參構(gòu)造是可以訪問的
constructor.setAccessible(true);
//產(chǎn)生一個實(shí)例對象
singleton =(Singleton)constructor.newInstance();
}catch(Exception e){
}
}
2.4延遲加載工廠類
  • 簡單來說,就是創(chuàng)建好實(shí)例后践宴,不馬上釋放掉鲸匿。而是保存在內(nèi)存之中,留做以后使用阻肩。
  • 單多個對象需要采用單例模式是带欢,可以把創(chuàng)建一個工程,用一個map容器去保存它們烤惊。

3.抽象工廠模式

  • 定義:為創(chuàng)建一組相關(guān)或相互依賴的對象提供的一個接口乔煞,而且無需指定他們的具體類
  • 個人理解:需要生產(chǎn)出來的東西具有屬性交叉的特性。即A柒室、B產(chǎn)品具有相同的共性瘤缩,也有不同的特性。為了實(shí)現(xiàn)生產(chǎn)伦泥,根據(jù)其特性實(shí)現(xiàn)工程剥啤,然后創(chuàng)建出具有共性又有特性的產(chǎn)品锦溪。


    image.png

    image.png
  • 優(yōu)點(diǎn):封裝性、產(chǎn)品族內(nèi)的約束為非公開狀態(tài)府怯。
  • 缺點(diǎn):擴(kuò)展困難幸海。
  • 場景:當(dāng)一個對象族都有相同約束時候药磺,可以采用這種模式躁锡。例如同一個產(chǎn)品抒抬,想要運(yùn)行在ios,和android冲簿。那么他就需要有兩個開發(fā)團(tuán)隊(duì)(工廠)去創(chuàng)建該項(xiàng)目粟判。
  • 代碼地址:
工廠模式和抽象工廠模式的區(qū)別
  • 工廠模式:一個抽象的產(chǎn)品,通過工廠創(chuàng)建出不同的具體產(chǎn)品峦剔。并且档礁,產(chǎn)品的創(chuàng)建過程是在工廠之中的。
  • 抽象工程模式:跟該模式有個相關(guān)的概念是產(chǎn)品族吝沫,抽象模式中有多個產(chǎn)品族工廠呻澜,每個產(chǎn)品族工廠生產(chǎn)出來的產(chǎn)品跟其他產(chǎn)品族具有相同的產(chǎn)品特性,也有自身產(chǎn)品族的特性惨险。因此羹幸,抽象工廠模式添加產(chǎn)品族簡單,但是增加產(chǎn)品結(jié)構(gòu)缺很蛋疼辫愉。因?yàn)樾枰獙χ暗拿總€產(chǎn)品族重新修改栅受,連同產(chǎn)品類的結(jié)構(gòu)也要發(fā)生改變。
  • 產(chǎn)品族和產(chǎn)品等級結(jié)構(gòu):
    假設(shè)羅技公司有低中高三種工廠恭朗,他們同時都生產(chǎn)鼠標(biāo)窘疮、鍵盤、攝像頭冀墨。
    那么這時候低級工廠、中級工廠等就分別是產(chǎn)品族鼠標(biāo)涛贯、鍵盤诽嘉、攝像頭就分別是產(chǎn)品等級結(jié)構(gòu)
    ——引自知乎

4.模板方法模式

定義:定義一個操作中的算法框架,將一些步驟(特性)延遲到子類中弟翘。使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟虫腋。

自我理解:之前在寫女媧造人的例子中,也用到了模板模式稀余。首先悦冀,共性的東西(由抽象類實(shí)現(xiàn))例如人都可以說話、吃飯睛琳、走路盒蟆。特性(由具體類實(shí)現(xiàn))人分男女踏烙,這個東西需要具體到最終的實(shí)現(xiàn)類中實(shí)現(xiàn)。

注意: 為防止惡意的操作历等,一般模板方法都加上final讨惩,不允許復(fù)寫

優(yōu)點(diǎn):封裝不變部分,擴(kuò)展可變部分寒屯;提取公共部分代碼荐捻,便于維護(hù);行為由父類控制寡夹,子類實(shí)現(xiàn)处面;
缺點(diǎn): 子類執(zhí)行結(jié)果影響父類的結(jié)果。

  • 類圖


    image.png

5.建造者模式

  • 將一個復(fù)雜對象的構(gòu)建與它的表示分離菩掏,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示魂角。
  • 自我理解(書中的描述跟我的理解有出入),構(gòu)造者模式的特色是能夠讓調(diào)用者根據(jù)自身情況進(jìn)行建造。采用建造模式患蹂,還可以讓建造者一目了然的了解的建造的元素結(jié)構(gòu)或颊。


    image.png

代碼地址:https://github.com/cyp206/DesignModeLearning/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市传于,隨后出現(xiàn)的幾起案子囱挑,更是在濱河造成了極大的恐慌,老刑警劉巖沼溜,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平挑,死亡現(xiàn)場離奇詭異,居然都是意外死亡系草,警方通過查閱死者的電腦和手機(jī)通熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來找都,“玉大人唇辨,你說我怎么就攤上這事∧艹埽” “怎么了赏枚?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晓猛。 經(jīng)常有香客問我饿幅,道長,這世上最難降的妖魔是什么戒职? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任栗恩,我火速辦了婚禮,結(jié)果婚禮上洪燥,老公的妹妹穿的比我還像新娘磕秤。我一直安慰自己乳乌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布亲澡。 她就那樣靜靜地躺著钦扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪床绪。 梳的紋絲不亂的頭發(fā)上客情,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音癞己,去河邊找鬼膀斋。 笑死,一個胖子當(dāng)著我的面吹牛痹雅,可吹牛的內(nèi)容都是我干的仰担。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绩社,長吁一口氣:“原來是場噩夢啊……” “哼摔蓝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愉耙,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贮尉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后朴沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猜谚,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年赌渣,在試婚紗的時候發(fā)現(xiàn)自己被綠了魏铅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坚芜,死狀恐怖览芳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸿竖,我是刑警寧澤沧竟,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站千贯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搞坝。R本人自食惡果不足惜搔谴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桩撮。 院中可真熱鬧敦第,春花似錦峰弹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至右钾,卻和暖如春蚁吝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舀射。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工窘茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脆烟。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓山林,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邢羔。 傳聞我的和親對象是個殘疾皇子驼抹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容