《每天進(jìn)步一點(diǎn)點(diǎn)》DAY7: 常用設(shè)計(jì)模式

單例模式

  • (1)餓漢式 開發(fā)用這種方式儒老。
//餓漢式(聲明靜態(tài)對(duì)象時(shí)就初始化對(duì)象)
public class Singleton
{
    // 1,私有構(gòu)造函數(shù)
    private Singleton()
    {
    }

    // 2,創(chuàng)建本類對(duì)象
    private static Singleton mInstance = new Singleton();

    // 3,對(duì)外提供公共的訪問方法
    public static Singleton getInstance()
    {
        return mInstance ;
    }
}

  • (2)懶漢式 (多線程的問題)
//懶漢式,單例的延遲加載模式(線程不安全)
public class Singleton
{
    // 1,私有構(gòu)造函數(shù)
    private Singleton()
    {
    }

    // 2,聲明一個(gè)本類的引用
    private static Singleton s;

    // 3,對(duì)外提供公共的訪問方法
    public static Singleton getInstance()
    {
        if (s == null)
        {
            // 線程1,線程2...多線程時(shí)可能會(huì)創(chuàng)建多個(gè)對(duì)象
            s = new Singleton();
        }
        return s;
    }
}

多線程安全比原,但是效率低:
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

// 每次調(diào)用都同步莫其,這樣會(huì)消耗不必要的資源
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}
            
雙重鎖定:
public class Singleton
{
    // 1,私有構(gòu)造函數(shù)
    private Singleton()
    {
    }

    // 2,聲明一個(gè)本類的引用
    private static Singleton s;

    // 3,對(duì)外提供公共的訪問方法墓阀,加鎖塌碌,解決多線程同時(shí)訪問會(huì)創(chuàng)建多個(gè)對(duì)象的問題
    public static Singleton getInstance()
    {
        if (s == null)
        {
            synchronized (Singleton.class)
            {
                if (s == null)
                {
                    s = new Singleton();
                }
            }
        }
        return s;
    }
}

  • (3)靜態(tài)內(nèi)部類方式實(shí)現(xiàn)
public class Singleton {
    private Singleton() {}
    
        private static class SingletonHolder 
       {        
         private static final Singleton INSTANCE = new Singleton();
       }
      public static Singleton getInstance()
      {
              return SingletonHolder.INSTANCE;
      }
}
這種方式舆驶,第一次加載Singleton這個(gè)類時(shí)橱健,不會(huì)加載SingletonHolder。只有第一次調(diào)用 getInstance()時(shí)才會(huì)初始化實(shí)例INSTANCE沙廉。即保證了線程安全畴博,也保證了單例對(duì)象的唯一性,同時(shí)也延遲了單例的初始化蓝仲,是推薦使用的單例模式實(shí)現(xiàn)方式俱病。

簡(jiǎn)單工廠模式

  • A:簡(jiǎn)單工廠模式概述
    • 又叫靜態(tài)工廠方法模式官疲,它定義一個(gè)具體的工廠類負(fù)責(zé)創(chuàng)建一些類的實(shí)例
  • B:優(yōu)點(diǎn)
    • 客戶端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建,從而明確了各個(gè)類的職責(zé)
  • C:缺點(diǎn)
    • 這個(gè)靜態(tài)工廠類負(fù)責(zé)所有對(duì)象的創(chuàng)建亮隙,如果有新的對(duì)象增加途凫,或者某些對(duì)象的創(chuàng)建方式不同,就需要不斷的修改工廠類溢吻,不利于后期的維護(hù)

舉例:


class AnimalFactory {
    private AnimalFactory() {}

    public static Animal createAnimal(String animalName) 
    {
        if(“dog”.equals(animalName)) 
        { 
            return new Dog();
        }
        else if(“cat”.equals(animale))
        {
            return new Cat();
        }else 
        {
            return null;
        }
    }
}

工廠方法模式

  • A:工廠方法模式概述
    • 工廠方法模式中抽象工廠類負(fù)責(zé)定義創(chuàng)建對(duì)象的接口维费,具體對(duì)象的創(chuàng)建工作由繼承抽象工廠的具體類實(shí)現(xiàn)。
  • B:優(yōu)點(diǎn)
    • 客戶端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建促王,從而明確了各個(gè)類的職責(zé)犀盟,如果有新的對(duì)象增加,只需要增加一個(gè)具體的類和具體的工廠類即可蝇狼,不影響已有的代碼阅畴,后期維護(hù)容易,增強(qiáng)了系統(tǒng)的擴(kuò)展性
  • C:缺點(diǎn)
    • 需要額外的編寫代碼迅耘,增加了工作量
  • D: 舉例
  •   動(dòng)物抽象類:public abstract Animal { public abstract void eat(); }
      工廠接口:public interface Factory {public abstract Animal createAnimal();}
      具體狗類:public class Dog extends Animal {}
      具體貓類:public class Cat extends Animal {}
      開始贱枣,在測(cè)試類中每個(gè)具體的內(nèi)容自己創(chuàng)建對(duì)象,但是颤专,創(chuàng)建對(duì)象的工作如果比較麻煩纽哥,就需要有人專門做這個(gè)事情,所以就知道了一個(gè)專門的類來創(chuàng)建對(duì)象栖秕。發(fā)現(xiàn)每次修改代碼太麻煩春塌,用工廠方法改進(jìn),針對(duì)每一個(gè)具體的實(shí)現(xiàn)提供一個(gè)具體工廠簇捍。
      狗工廠:public class DogFactory implements Factory {
          public Animal createAnimal() {…}
              }
      貓工廠:public class CatFactory implements Factory {
          public Animal createAnimal() {…}
              } 
    

適配器模式

  • 類適配器模式

    • a.什么是類適配器
      • 在使用監(jiān)聽器的時(shí)候, 需要定義一個(gè)類事件監(jiān)聽器接口.
      • 通常接口中有多個(gè)方法, 而程序中不一定所有的都用到, 但又必須重寫, 這很繁瑣.
      • 適配器簡(jiǎn)化了這些操作, 我們定義監(jiān)聽器時(shí)只要繼承適配器, 然后重寫需要的方法即可.
    • b.適配器原理
      • 適配器就是一個(gè)類, 實(shí)現(xiàn)了監(jiān)聽器接口, 所有抽象方法都重寫了, 但是方法全是空的.
      • 適配器類需要定義成抽象的,因?yàn)閯?chuàng)建該類對(duì)象,調(diào)用空方法是沒有意義的
      • 目的就是為了簡(jiǎn)化程序員的操作, 定義監(jiān)聽器時(shí)繼承適配器, 只重寫需要的方法就可以了.
  • 對(duì)象適配器模式(常用)

    • 通常情況下只壳,客戶端可以通過目標(biāo)類的接口訪問它所提供的服務(wù)。但有時(shí)垦写,現(xiàn)有的類雖然可以滿足客戶類的功能需要吕世,但是它所提供的接口不一定是客戶類所期望的,這可能是因?yàn)楝F(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的梯投。
    • 在適配器模式中可以定義一個(gè)包裝類命辖,包裝不兼容接口的對(duì)象,這個(gè)包裝類指的就是適配器(Adapter)分蓖,它所包裝的對(duì)象就是適配者(Adaptee)尔艇,即被適配的類。
    • 適配器可以使由于接口不兼容而不能交互的類可以一起工作么鹤。

裝飾模式

  • 什么是裝飾模式
    • 動(dòng)態(tài)地將責(zé)任附加到對(duì)象上终娃,若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案蒸甜。
    • 使用裝飾器模式的時(shí)候棠耕,通常的做法是將原始對(duì)象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器余佛。
  • 案例
    • java里的BufferedInputStream的設(shè)計(jì)
    • public BufferedInputStream(InputStream in),BufferedInputStream包裝了InputStream窍荧,擴(kuò)展了功能

代理模式

  • 給某一個(gè)對(duì)象提供一個(gè)代理辉巡,并由代理對(duì)象控制對(duì)原對(duì)象的引用
  • 當(dāng)使用代理模式的時(shí)候,通常在一個(gè)代理類中創(chuàng)建一個(gè)對(duì)象的實(shí)例
  • 代理模式對(duì)代理的對(duì)象施加控制蕊退,并不提供對(duì)象本身的增強(qiáng)功能
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郊楣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓤荔,更是在濱河造成了極大的恐慌净蚤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输硝,死亡現(xiàn)場(chǎng)離奇詭異今瀑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腔丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門放椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作烟,“玉大人愉粤,你說我怎么就攤上這事∧昧茫” “怎么了衣厘?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)压恒。 經(jīng)常有香客問我影暴,道長(zhǎng),這世上最難降的妖魔是什么探赫? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任型宙,我火速辦了婚禮,結(jié)果婚禮上伦吠,老公的妹妹穿的比我還像新娘妆兑。我一直安慰自己,他們只是感情好毛仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布搁嗓。 她就那樣靜靜地躺著,像睡著了一般箱靴。 火紅的嫁衣襯著肌膚如雪腺逛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天衡怀,我揣著相機(jī)與錄音棍矛,去河邊找鬼安疗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛够委,可吹牛的內(nèi)容都是我干的茂契。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慨绳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掉冶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脐雪,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤厌小,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后战秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧亚,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年脂信,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癣蟋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狰闪,死狀恐怖疯搅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埋泵,我是刑警寧澤幔欧,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站丽声,受9級(jí)特大地震影響礁蔗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雁社,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一浴井、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霉撵,春花似錦磺浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至崭参,卻和暖如春呵曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工奄喂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐殃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓跨新,卻偏偏與公主長(zhǎng)得像富腊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子域帐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類變化的原因赘被。如果一個(gè)類有多于一個(gè)的動(dòng)機(jī)被改變,那么這個(gè)類就具有多于...
    JxMY閱讀 938評(píng)論 1 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理肖揣,服務(wù)發(fā)現(xiàn)民假,斷路器,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 設(shè)計(jì)模式匯總 一龙优、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用羊异、多...
    MinoyJet閱讀 3,939評(píng)論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法彤断,內(nèi)部類的語(yǔ)法野舶,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法宰衙,線程的語(yǔ)...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • 1.只觀察平道,不評(píng)論。 通過觀察菩浙,認(rèn)清事物本質(zhì)巢掺,不加主觀評(píng)論句伶。 2.只說感受劲蜻,不說看法。 說感受就是多表達(dá)自己的真事...
    貓群楊大叔閱讀 114評(píng)論 0 0