項目知識點整理——設計模式部分


Java中的Builder模式

作為一只小白逊桦,在看到下面這樣額的代碼時,還真是一臉懵逼卜高。弥姻。。

 new IncomingGarmentStatBuilder()
                        .id(UUID.randomUUID())
                        .endDateInRange(toDate)
                        .range(DAILY)
                        .org(organization)
                        .value(sumValueByOrg(dailyOnceStats, organization))
                        .build()

雖然可以猜到是在創(chuàng)建新對象掺涛,但是這種方式還真是詭異呢??


什么鬼庭敦?

再加上當這段代碼混在java 8 的stream處理過程中時,像下面這樣薪缆,

 List<IncomingGarmentStat> dailyStats = organizations.stream()
                .map(organization ->
                new IncomingGarmentStatBuilder()
                        .id(UUID.randomUUID())
                        .endDateInRange(toDate)
                        .range(DAILY)
                        .org(organization)
                        .value(sumValueByOrg(dailyOnceStats, organization))
                        .build())
                .collect(Collectors.toList());

不學無術的我更難以理解這一堆方法調用是在干什么了秧廉。。拣帽。

這是在干嘛疼电?

不過沒有關系,看不懂這一堆方法調用减拭,可以一個一個來蔽豺。
可以從對我而言比較奇怪的這個Builder類的構造方法入手,點進去看看就好了拧粪。
這不看還好修陡,一看真是嚇一跳。這個Builder類長成了這個樣子:

public class IncomingGarmentStatBuilder {
    private IncomingGarmentStat incomingGarmentStat;

    public IncomingGarmentStatBuilder() {
        incomingGarmentStat = new IncomingGarmentStat();
    }

    public IncomingGarmentStatBuilder(IncomingGarmentStat incomingGarmentStat) {
        this.incomingGarmentStat = incomingGarmentStat;
    }

    public IncomingGarmentStat build() {
        return incomingGarmentStat;
    }

    public IncomingGarmentStatBuilder id(UUID id) {
        incomingGarmentStat.setId(id);
        return this;
    }

    public IncomingGarmentStatBuilder range(StatisticRange range) {
        incomingGarmentStat.setRange(range);
        return this;
    }
....
}

可以看出既们,這個Builder類是對所構造的類的set方法在此進行了一次封裝濒析,使得可以通過調用與屬性名相同的方法名為當前所構建的對象set屬性值。
那么問題來了啥纸,當我在創(chuàng)建一個實體類号杏,一般也就是一個Java Bean時,都會設計這個類的get、set方法盾致,并通過這些方法給所要創(chuàng)建的對象賦值主经。
簡單來說,例如對于一個People類而言庭惜,

public class People {
  
   private int id;
   private String name;
   private int age;
   private String gender;

  public People() {
  }

  public People(int id, String name, int age, String gender) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.gender = gender;
  }

  public setId(int id) {
    this.id = id;
  }

  public getId() {
    return id;
  }

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

  public getName() {
    return name;
  }
  
  public setAge(int age) {
    this.age = age;
  }

  public getAge() {
    return age;
  }

  public setGender(String gender) {
    this.gender = gender;
  }

  public getGender() {
    return gender;
  }
}

一般都長成上面這樣罩驻。按照這種大眾化的People類的設計方式,我去創(chuàng)建一個新的People對象時护赊,可以有兩種方法:

  • 直接調用構造方法惠遏,把給定的參數(shù)通過構造方法傳入,如下:
    People person = new People(9527, "華安", 24, "男")骏啰;
  • 通過新建一個空對象使用set方法完成對象構建节吮,如下:
People person = new People();
person.setId(9527);
person.setName("華安");
person.setAge(24);
person.setGender("男");

這兩種方法也是我常用的方法。其實對于上述例子中的People判耕,因為屬性較少透绩,我們通過上述的兩種方式去創(chuàng)建實例對象都還較為方便易懂。但可以設想一下壁熄,若對于一個含有多種屬性的復雜類而言帚豪,使用這種構造器傳參或者使用set方法完成初始化實例對象的工作會帶來什么問題?

  1. 對于通過構造器傳參創(chuàng)建新對象草丧,在參數(shù)較多的情況下狸臣,會使得傳入?yún)?shù)和其對應的參數(shù)含義分離,對于讀代碼的人而言方仿,不會一下就能明白這些參數(shù)的意義何在固棚。
  2. 對于set方法傳參而言,顯而易見的是在大量屬性需要set的情況下仙蚜,需要調用多種的set方法此洲,從而使得在構建一個對象的過程中,使得代碼過于冗長委粉。

因此呜师,Builder類的采用,也就是建造者模式贾节,可以再保證代碼可讀性的前提下汁汗,使對象的創(chuàng)建變得靈活、簡潔栗涂。對于上述的People類知牌,采用建造者模式后,其PeopleBuilder類設計如下:

public class PeopleBuilder {
  private People person;
  
  public PeopleBuilder() {
    person = new People();
  }

  public PeopleBuilder(People person) {
    this.person = person; 
  }

  public PeopleBuilder id(int id) {
    person.setId(id);
    return this;
  }

   public PeopleBuilder name(String name) {
    person.setName(name);
    return this; 
  }

  public PersonBuilder age(int age) {
    person.setAge(age);
    return this;
  }

  public PersonBuilder gender(String gender) {
    person.setGender(gender);
    return this;
  }

  public People build() {
    return person;
  }
}

如此一來斤程,如果要創(chuàng)建一個People對象角寸,就可以用如下方式:

People person = new PeopleBuilder().id(9527)
                                   .name("華安")
                                   .age(24)
                                   .gender("男")
                                   .build();

如此一來相比之前的set方法就可以顯得十分簡潔明了。并且當這種方式嵌入到Stream的處理流中,或者Lambda表達式中時扁藕,也是毫無違和感的沮峡。
這就是建造者模式在Java中的使用了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末亿柑,一起剝皮案震驚了整個濱河市邢疙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌望薄,老刑警劉巖疟游,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痕支,居然都是意外死亡乡摹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門采转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞬痘,你說我怎么就攤上這事故慈。” “怎么了框全?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵察绷,是天一觀的道長。 經(jīng)常有香客問我津辩,道長拆撼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任喘沿,我火速辦了婚禮闸度,結果婚禮上,老公的妹妹穿的比我還像新娘蚜印。我一直安慰自己莺禁,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布窄赋。 她就那樣靜靜地躺著哟冬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忆绰。 梳的紋絲不亂的頭發(fā)上浩峡,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音错敢,去河邊找鬼翰灾。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的预侯。 我是一名探鬼主播致开,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萎馅!你這毒婦竟也來了双戳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤糜芳,失蹤者是張志新(化名)和其女友劉穎飒货,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峭竣,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡塘辅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皆撩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扣墩。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扛吞,靈堂內的尸體忽然破棺而出呻惕,到底是詐尸還是另有隱情,我是刑警寧澤滥比,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布亚脆,位于F島的核電站,受9級特大地震影響盲泛,放射性物質發(fā)生泄漏濒持。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一寺滚、第九天 我趴在偏房一處隱蔽的房頂上張望柑营。 院中可真熱鬧,春花似錦村视、人聲如沸由境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虏杰。三九已至,卻和暖如春勒虾,著一層夾襖步出監(jiān)牢的瞬間纺阔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工修然, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笛钝,地道東北人质况。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像玻靡,于是被迫代替她去往敵國和親结榄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法囤捻,類相關的語法臼朗,內部類的語法,繼承相關的語法蝎土,異常的語法视哑,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)誊涯,斷路器挡毅,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 一:java概述:1,JDK:Java Development Kit暴构,java的開發(fā)和運行環(huán)境跪呈,java的開發(fā)工...
    ZaneInTheSun閱讀 2,629評論 0 11
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,071評論 0 62
  • 天氣陰。黃沙漫天菌赖,空氣質量嚴重污染。 事情雜亂沐序,人不能亂琉用。 今天算是滿滿當當?shù)囊惶欤欢@只是一個開始…學校的課程...
    W的兩個世界閱讀 200評論 0 0