先不介紹Builder使用場景,通過擼碼的方式簡單粗暴译隘。
業(yè)務需求:
現(xiàn)有PersonInfo對象亲桥,ta有姓名,年齡(必參)基本信息,
還有一下愛好固耘,電話题篷,地址(可選),通過編程實現(xiàn)做一個自我介紹厅目。
分析業(yè)務需求番枚,挖掘信息:
從業(yè)務需求可以知道 name(姓名)age(年齡)法严,屬于必要參數(shù),hobby(愛好) phone(電話) address(地址)屬于可選參數(shù)葫笼。
實現(xiàn)
public class PersonInfo {
//必要參數(shù)
private String name; //姓名
private int age; //年齡
//可選參數(shù)
private String hobby; //愛好
private String phone; //電話
private String address; //地址
//在實際開發(fā)中深啤,遇到這樣必傳的參數(shù),一般是這樣做
public PersonInfo(){
}
//做法一:必參放構(gòu)造器中傳值
public PersonInfo(String name,int age){
this.name =name;
this.age =age;
}
//做法二:必參和可選 放一起通過構(gòu)造器傳值
public PersonInfo(String name, int age, String hobby) {
this.name = name;
this.age = age;
this.hobby = hobby;
}
//做法二:必參和可選 放一起通過構(gòu)造器傳值
public PersonInfo(String name, int age, String hobby, String phone) {
this.name = name;
this.age = age;
this.hobby = hobby;
this.phone = phone;
}
//做法二:必參和可選 放一起通過構(gòu)造器傳值
public PersonInfo(String name, int age, String hobby, String phone, String address) {
this.name = name;
this.age = age;
this.hobby = hobby;
this.phone = phone;
this.address = address;
}
//----------------------下面是 get set方法賦值-------------------------
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "我叫:"+name+"今年"+age+",喜歡:"+hobby+",電話是:"+phone+",住在:"+address;
}
}
調(diào)用及打印結(jié)果:
// 做法一 通過重疊構(gòu)造器直接賦值路星,
PersonInfo info=new PersonInfo("張三",11,"喜歡吃雞");
PersonInfo info1=new PersonInfo("張三",11,"喜歡吃雞","110110");
PersonInfo info2=new PersonInfo("張三",11,"喜歡吃雞","110110","魔都");
//做法二:通過get set 賦值
PersonInfo info3 =new PersonInfo();
info3.setName("李四");
info3.setAge(22);
info3.setHobby("喜歡小姐姐");
info3.setPhone("120120");
info3.setAddress("魔都");
//
Log.d("toString",info.toString());
Log.d("toString",info1.toString());
Log.d("toString",info2.toString());
Log.d("toString",info3.toString());
我叫:張三今年11,喜歡:喜歡吃雞,電話是:null,住在:null
我叫:張三今年11,喜歡:喜歡吃雞,電話是:110110,住在:null
我叫:張三今年11,喜歡:喜歡吃雞,電話是:110110,住在:魔都
我叫:李四今年22,喜歡:喜歡小姐姐,電話是:120120,住在:魔都
通過打印結(jié)果溯街,完美的實現(xiàn)了自我介紹,來看看我們是如何實現(xiàn)的洋丐,通過代碼呈昔,很容易看出是通過構(gòu)造方法直接賦值(一般常用的寫法,直接構(gòu)造方法賦值)友绝,或者通過 get set 方法賦值橄唬,java 基礎(chǔ)面向?qū)ο髮崿F(xiàn)疾棵,似乎么有啥毛病。接著往下看
Builder模式(推薦)
public class PersonInfo {
//必要參數(shù)
private String name; //姓名
private int age; //年齡
//可選參數(shù)
private String hobby; //愛好
private String phone; //電話
private String address; //地址
private PersonInfo(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.hobby = builder.hobby;
this.phone = builder.phone;
this.address = builder.address;
}
//定義一個Builder類
public static class Builder {
//必要參數(shù)
private String name; //姓名
private int age; //年齡
//可選參數(shù)
private String hobby; //愛好
private String phone; //電話
private String address; //地址
//把必參 料皇,可選參數(shù)分開咬腕,很重要哦
public Builder(String name, int age) {
this.name = name;
this.age = age;
}
public Builder setHobby(String hobby) {
this.hobby = hobby;
return this;
}
public Builder setPhone(String phone) {
this.phone = phone;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public PersonInfo build() {
return new PersonInfo(this);
}
}
@Override
public String toString() {
return "Builder實現(xiàn)--->我叫:"+name+"今年"+age+",喜歡:"+hobby+",電話是:"+phone+",住在:"+address;
}
}
調(diào)用及打印結(jié)果:
PersonInfo info=new PersonInfo.Builder("李四",11)
.setHobby("喜歡小姐姐")
.setPhone("110110")
.setAddress("魔都")
.build();
Builder實現(xiàn)--->我叫:李四今年11,喜歡:喜歡小姐姐,電話是:110110,住在:魔都
對比一下進行一個優(yōu)劣性分析:
看看兩種調(diào)用方式:
一般的套路:優(yōu)點是比較簡單咏删,開發(fā)效率高秦士,缺點是如果參數(shù)真的很多的話鬼知道每個對應的是什么意思啊舷夺。(必參,跟可選都在構(gòu)造器里面一把擼過去了)
Builder模式:優(yōu)點:分離必要跟次要(這里指必參跟可選)切威,可讀性較高。
缺點:比較冗長丙号。明明可以簡單粗暴的方式實現(xiàn)先朦,非得裝個逼。
截圖對比: