什么是建造者模式
- 建造者模式又叫生成器模式, 是一種對象構(gòu)建模式
- 可以將復(fù)雜對象的構(gòu)建過程抽象出來, 使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象
- 建造者模式有4個(gè)角色
Product(產(chǎn)品): 具體的產(chǎn)品對象
Builder(抽象建造者): 創(chuàng)建一個(gè)Product對象的各個(gè)部件指定的接口或抽象類
ConcreteBuilder(具體建造者): 實(shí)現(xiàn)接口, 構(gòu)建和裝配各個(gè)部件
Director(指揮者): 構(gòu)建一個(gè)使用Builder接口的對象。隔離了客戶與對象的生產(chǎn)過程,同時(shí)負(fù)責(zé)控制產(chǎn)品對象的生產(chǎn)過程
案例需求
- 建房子, 打地基、切墻、封頂?shù)攘鞒?/li>
- 房子分普通房子、高樓等
- 傳統(tǒng)方式實(shí)現(xiàn)
/**
* 抽象的建造者
*/
public abstract class HouseBuilder {
//打地基
public abstract void buildBase();
//砌墻
public abstract void buildWall();
//封頂
public abstract void buildRoofed();
//建房
public void buildHouse(){
buildBase();
buildWall();
buildRoofed();
}
}
/**
* 普通房子
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBase() {
System.out.println("普通房子打地基");
}
@Override
public void buildWall() {
System.out.println("普通房子砌墻");
}
@Override
public void buildRoofed() {
System.out.println("普通房子封頂");
}
}
# 測試
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
commonHouse.buildHouse();
}
# 輸出
普通房子打地基
普通房子砌墻
普通房子封頂
分析: 這種方式比較好理解,但是擴(kuò)展和維護(hù)性不好,把房子和創(chuàng)建房子的過程封裝在一起,耦合性太高。
- 建造者模式實(shí)現(xiàn)
# 產(chǎn)品
public class House {
private String base;
private String wall;
private String roofed;
// getter、setter和toString方法省略
}
/**
* 抽象的構(gòu)建者
*/
public abstract class HouseBuilder {
protected House house = new House();
//抽象方法
public abstract void buildBase();
public abstract void buildWall();
public abstract void buildRoofed();
//構(gòu)建房子
public House buildHouse(){
return house;
}
}
/**
* 具體構(gòu)建者
* 修建普通房子
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBase() {
house.setBase("普通房子打地基");
}
@Override
public void buildWall() {
house.setWall("普通房子砌墻");
}
@Override
public void buildRoofed() {
house.setRoofed("普通房子封頂");
}
}
/**
* 指揮者
*/
public class HouseDirector {
HouseBuilder houseBuilder = null;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House createHouse(){
houseBuilder.buildBase();
houseBuilder.buildWall();
houseBuilder.buildRoofed();
return houseBuilder.buildHouse();
}
}
# 測試
public static void main(String[] args) {
HouseDirector houseDirector = new HouseDirector(new CommonHouse());
House house = houseDirector.createHouse();
System.out.println(house);
}
輸出:
House{base='打地基', wall='砌墻', roofed='封頂'}
如果我們要新增別墅類型的房子,怎么增加?
只需要增加具體構(gòu)建者VillaHouse類
/**
* 具體構(gòu)建者
* 修建別墅
*/
public class VillaHouse extends HouseBuilder{
@Override
public void buildBase() {
house.setBase("別墅打地基");
}
@Override
public void buildWall() {
house.setWall("別墅砌墻");
}
@Override
public void buildRoofed() {
house.setRoofed("別墅封頂");
}
}
public static void main(String[] args) {
HouseDirector houseDirector = new HouseDirector(new VillaHouse());
House house = houseDirector.createHouse();
System.out.println(house);
}
輸出:
House{base='別墅打地基', wall='別墅砌墻', roofed='別墅封頂'}
- 建造者模式注意事項(xiàng)和細(xì)節(jié)
1.客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身和產(chǎn)品的創(chuàng)建過程解耦,使用相同的創(chuàng)建過程即可創(chuàng)建不同的產(chǎn)品對象
2.每一個(gè)創(chuàng)建者都是獨(dú)立,與其他創(chuàng)建者無關(guān),因此可以很方便的替換具體的創(chuàng)建者或新增創(chuàng)建者,用戶可以使用不同的創(chuàng)建者創(chuàng)建不同的對象
抽象工廠模式 VS 創(chuàng)造者模式
1.抽象工廠模式實(shí)現(xiàn)對同一類產(chǎn)品的創(chuàng)建,不用關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品用什么工廠即可
2.建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝配件而產(chǎn)生一個(gè)新產(chǎn)品