源代碼
GitHub源代碼
1.本文目標(biāo)
本文目標(biāo)是為了讓大家認(rèn)識(shí)并理解建造者設(shè)計(jì)模式。
2.基本套路
定義:將一個(gè)復(fù)雜的對(duì)象的構(gòu)建和它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
類(lèi)型:創(chuàng)建型
選擇關(guān)鍵點(diǎn):各個(gè)產(chǎn)品的構(gòu)建過(guò)程是否相同
設(shè)計(jì)原則:遵循單一職責(zé)、開(kāi)閉原則
使用概率:10%
難度系數(shù):中
3.適用場(chǎng)景
1.如果一個(gè)對(duì)象有非常復(fù)雜的內(nèi)部結(jié)構(gòu)(很多屬性字段)
2.想把復(fù)雜對(duì)象的創(chuàng)建和使用分離。
4.使用步驟
1.定義大俠的過(guò)程(Builder):定義大俠的名字,年齡和武功
2.構(gòu)建真正的Person對(duì)象并返回
3.Builder屬性賦值給Person
4.創(chuàng)建具體的建造者
5.客戶(hù)端調(diào)用-創(chuàng)建武林隱士高手
5.舉個(gè)栗子
我們用具體的代碼去更好的理解這個(gè)設(shè)計(jì)模式
5.1栗子說(shuō)明
- 背景:打游戲想創(chuàng)建一個(gè)武林大俠
- 目的:希望通過(guò)建造者模式去創(chuàng)建
5.2使用步驟
實(shí)現(xiàn)代碼如下:
public class Person {
private String mName;
private int mAge;
private String mKungFu;
/**
* 步驟3:Builder屬性賦值給Person
* 構(gòu)造函數(shù)私有化
* 只讓下面的靜態(tài)方法builder()能夠創(chuàng)建對(duì)象
*/
private Person(Builder builder) {
mName = builder.getName();
mAge = builder.getAge();
mKungFu = builder.getKungFu();
}
/**
* 步驟4:創(chuàng)建具體的建造者
* 構(gòu)建Person對(duì)象的構(gòu)建器,就是通過(guò)Builder這個(gè)對(duì)象去構(gòu)建Person對(duì)象
*/
public static Builder builder() {
return new Builder();
}
/**
* 步驟1:定義大俠的過(guò)程(Builder):定義大俠的名字,年齡和武功
*/
public static class Builder {
private String mName;
private int mAge;
private String mKungFu;
public Builder setName(String name) {
this.mName = name;
return this;
}
public Builder setAge(int age) {
this.mAge = age;
return this;
}
public Builder setKungFu(String kungfu) {
this.mKungFu = kungfu;
return this;
}
public String getName() {
return mName;
}
public int getAge() {
return mAge;
}
public String getKungFu() {
return mKungFu;
}
/**
* 步驟2:構(gòu)建真正的Person對(duì)象并返回
*/
public Person build() {
return new Person(this);
}
}
@Override
public String toString() {
return "Person{" +
"mName='" + mName + '\'' +
", mAge=" + mAge +
", mKungFu='" + mKungFu + '\'' +
'}';
}
}
測(cè)試類(lèi):
public static void main(String[] args) {
Person person = Person.builder()
.setName("風(fēng)清揚(yáng)")
.setAge(99)
.setKungFu("獨(dú)孤九劍")
.build();
System.out.println(person.toString());
}
6.優(yōu)點(diǎn)
- 封裝性好,創(chuàng)建和使用分離
- 擴(kuò)展性好,建造類(lèi)之間獨(dú)立,一定程度上解耦
7.缺點(diǎn)
- 產(chǎn)生多余的Builder對(duì)象
- 產(chǎn)品內(nèi)部發(fā)生變化,建造者都要修改,成本比較大
8.其他一些思考
建造者模式和工廠模式比較相近,所以二者的區(qū)別:
1.建造者模式更注重于方法的調(diào)用順序。
2.工廠模式注重于創(chuàng)建產(chǎn)品。
3.創(chuàng)建對(duì)象的力度不同,建造者模式可以創(chuàng)建復(fù)雜的產(chǎn)品,由各種復(fù)雜的部件組成,工廠模式創(chuàng)建出來(lái)的都是一個(gè)樣子。
4.工廠模式把這個(gè)對(duì)象創(chuàng)建出來(lái)就OK了,但是建造者模式不只是要?jiǎng)?chuàng)建出這個(gè)產(chǎn)品,還要知道這個(gè)產(chǎn)品由哪些部件組成的。
9.總結(jié)
本文只是對(duì)建造者模式進(jìn)行一個(gè)分享,接下來(lái)會(huì)從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類(lèi)展開(kāi)一個(gè)系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦。