常用設(shè)計模式

單例模式

單例模式五種實現(xiàn):

1.餓漢模式:

public class Singleton {

  private final static Singleton SINGLETON = new Singleton();

  private Singleton() {
  }

  public static Singleton getInstance(){
    return SINGLETON;
  }

}
  • 優(yōu)點:
    • 單例對象的創(chuàng)建是線程安全的;
    • 獲取單例對象時不需要加鎖暑诸。
  • 缺點:單例對象的創(chuàng)建余赢,不是延時加載宿稀。

2.懶漢模式:

public class Singleton {

  private static Singleton SINGLETON;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (SINGLETON == null) {
      SINGLETON = new Singleton();
    }
    return SINGLETON;
  }

}
  • 優(yōu)點:
    • 對象的創(chuàng)建是線程安全的。
    • 支持延時加載嵌洼。
  • 缺點:獲取對象的操作被加上了鎖案疲,影響了并發(fā)度。
    • 如果單例對象需要頻繁使用麻养,那這個缺點就是無法接受的褐啡。
    • 如果單例對象不需要頻繁使用,那這個缺點也無傷大雅鳖昌。

3.雙重檢查:

public class Singleton {
    // Java 1.4 及更早的版本中有些問題备畦,就是指令重排序,需要給 SINGLETON 成員變量加上 volatile 關(guān)鍵字
  private static Singleton SINGLETON;

  private Singleton() {
  }

  public static Singleton getInstance() {
    if (SINGLETON == null) {
      synchronized (Singleton.class) {
        if (SINGLETON == null) {
          SINGLETON = new Singleton();
        }
      }
    }
    return SINGLETON;
  }

}

雙重檢測單例優(yōu)點:

  • 對象的創(chuàng)建是線程安全的遗遵。
  • 支持延時加載萍恕。
  • 獲取對象時不需要加鎖。

4.靜態(tài)內(nèi)部類

public class Singleton {

  private Singleton() {
  }

  private static class SingletonHolder {
    private static Singleton SINGLETON = new Singleton();
  }

  public static Singleton getInstance() {
    return SingletonHolder.SINGLETON;
  }
}

外部類 Singleton 加載時车要,不會創(chuàng)建 SingletonHolder 實例對象,只有調(diào)用 getInstance() 方法時崭倘,SingletonHolder 才會被加載翼岁,才會創(chuàng)建 SINGLETON 對象,SINGLETON 對象的線程安全和唯一性由 JVM 來保證司光。

靜態(tài)內(nèi)部類單例優(yōu)點:

  • 對象的創(chuàng)建是線程安全的琅坡。
  • 支持延時加載。
  • 獲取對象時不需要加鎖残家。

5.枚舉:

public enum Singleton {
  SINGLETON; // 該對象全局唯一
}

工廠方法模式

簡單工廠模式:是對產(chǎn)品的抽象榆俺,工廠根據(jù)傳入標(biāo)識生產(chǎn)各種類型的產(chǎn)品

public interface Phone {
  void make();
}

public class IPhone implements Phone {
  @Override
  public void make() {
    // 生產(chǎn) IPhone
  }
}

public class MiPhone implements Phone {
  @Override
  public void make() {
    // 生產(chǎn) MiPhone
  }
}

public class PhoneFactory {
  public Phone PhoneMake(String type) {
    if ("MiPhone".equals(type)) {
      return new MiPhone();
    } else {
      return new IPhone();
    }
  }
}

工廠方法模式:是對工廠的抽象,根據(jù)需要生成的產(chǎn)品坞淮,先生成對應(yīng)的工廠茴晋,然后由工廠生成產(chǎn)品。

interface Factory {
  void makePhone();
}

 public class MiFactory implements Factory {
  @Override
  public void makePhone() {
    // 生產(chǎn)MiPhone
  }
}

public class IPhoneFactory implements Factory {
  @Override
  public void makePhone() {
    // 生產(chǎn)IPhone
  }
}

public class Test{
  public static void main(String[] args) {
    Factory factory = new MiFactory();
    factory.makePhone();
  }
}

抽象工廠模式:上面兩種都是對單一產(chǎn)品族回窘,如果多類工廠對應(yīng)多類產(chǎn)品族诺擅,需要對產(chǎn)品和工廠都進(jìn)行抽象

// Phone產(chǎn)品族
interface Phone {
}

public class MiPhone implements Phone {
}

public class IPhone implements Phone {
}

// PC產(chǎn)品族
interface PC {
}

public class MiPC implements PC {
}

public class MAC implements PC {
}

// 工廠抽象
interface Factrory {
  Phone makePhone();
  PC makePC();
}
// Mi工廠
public class MiFactrory implements Factrory {
  @Override
  public Phone makePhone() {
    return new MiPhone();
  }

  @Override
  public PC makePC() {
    return new MiPC();
  }
}
// MAC工廠
public class MACFactrory implements Factrory {
  @Override
  public Phone makePhone() {
    return new IPhone();
  }

  @Override
  public PC makePC() {
    return new MAC();
  }
}

建造者模式

簡化版建造者模式,傳統(tǒng)的建造者模式會對Builder進(jìn)行抽象啡直,方便創(chuàng)建復(fù)雜的對象烁涌,比如 name 或者 age 是個復(fù)雜對象,同時還需要一個協(xié)調(diào)者來生成對象酒觅。

public class Human {

  String name;
  String age;
  String need;

  public Human(Builder builder) {
    this.name = builder.name;
    this.age = builder.age;
    this.need = builder.need;
  }

  public static class Builder {

    String name;
    String age;
    String need;


    public Builder(String need) {
      this.need = need;
    }

    public Builder setName(String name) {
      this.name = name;
      return this;
    }

    public Builder setAge(String age) {
      this.age = age;
      return this;
    }

    public Human build() {
      return new Human(this);
    }

  }

  public static void main(String[] args) {
    
    Human human = new Builder("need")
        .setName("name")
        .setAge("age")
        .build();
  }

}

原型模式

基于已有的對象創(chuàng)建重復(fù)對象撮执,同時又能保證性能

實現(xiàn)方式,在需要被重復(fù)創(chuàng)建的對象的類上實現(xiàn)clone接口即可舷丹,如果是深度克隆抒钱,需要單獨處理嵌套對象。例如數(shù)組對象,需要循環(huán)拷貝每個對象继效。

責(zé)任鏈模式

策略模式

模板方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末症杏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑞信,更是在濱河造成了極大的恐慌厉颤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡简,死亡現(xiàn)場離奇詭異逼友,居然都是意外死亡,警方通過查閱死者的電腦和手機秤涩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門帜乞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筐眷,你說我怎么就攤上這事黎烈。” “怎么了匀谣?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵照棋,是天一觀的道長。 經(jīng)常有香客問我武翎,道長烈炭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任宝恶,我火速辦了婚禮符隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垫毙。我一直安慰自己霹疫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布露久。 她就那樣靜靜地躺著更米,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毫痕。 梳的紋絲不亂的頭發(fā)上征峦,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音消请,去河邊找鬼栏笆。 笑死,一個胖子當(dāng)著我的面吹牛臊泰,可吹牛的內(nèi)容都是我干的蛉加。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼针饥!你這毒婦竟也來了厂抽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丁眼,失蹤者是張志新(化名)和其女友劉穎筷凤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苞七,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡藐守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹂风。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卢厂。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惠啄,靈堂內(nèi)的尸體忽然破棺而出慎恒,到底是詐尸還是另有隱情,我是刑警寧澤撵渡,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布巧号,位于F島的核電站,受9級特大地震影響姥闭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜越走,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一棚品、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廊敌,春花似錦铜跑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肋殴,卻和暖如春囤锉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背护锤。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工官地, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烙懦。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓驱入,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亏较,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 前言: 在Java中莺褒,傳說有23中模式,總共分為三大類雪情,分別是: 創(chuàng)建型模式(5種):工廠方法模式遵岩、抽象工廠模式、...
    貪挽懶月閱讀 999評論 0 13
  • 前言 很久前就一直想總結(jié)下常用的設(shè)計模式旺罢,但是各種原因一直拖到現(xiàn)在旷余,下面我嘗試用自己的理解去解釋常用的設(shè)計模式,旨...
    老實任閱讀 658評論 0 1
  • I. 引言 設(shè)計模式(Design Pattern)是一套被反復(fù)使用扁达、多數(shù)人知曉的正卧、經(jīng)過分類的、代碼設(shè)計經(jīng)驗的總結(jié)...
    garyond閱讀 2,686評論 0 2
  • 繼上一篇 Android常用設(shè)計模式(一)里認(rèn)識了觀察者跪解,適配器炉旷,代理等三種模式,這一篇將會講解以下三種模式: 工...
    Venus_明閱讀 4,296評論 0 55
  • 一叉讥、概念: 設(shè)計模式(Design pattern)是一套被反復(fù)使用窘行、多數(shù)人知曉的、經(jīng)過分類編目的代碼設(shè)計經(jīng)驗的總...
    Ethan_Liu666閱讀 709評論 0 0