什么是建造者模式
又稱創(chuàng)造者模式,將一個復(fù)雜的對象的構(gòu)建與它的表示分離旁仿,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示藕夫;隱藏了復(fù)雜對象的創(chuàng)建過程枯冈,它把復(fù)雜對象的創(chuàng)建過程加以抽象滩褥,通過子類或重載的方式,動態(tài)的創(chuàng)建具復(fù)合屬性的對象。
簡單解釋
使用創(chuàng)建者模式驹针,用戶只需要指定需要建造的類型就可以得到其垄,而不知道具體的建造細(xì)節(jié);
UML類圖
image
優(yōu)點(diǎn)
- 建造者獨(dú)立,易擴(kuò)展;
- 便于細(xì)節(jié)控制風(fēng)險;
- 隱藏了具體的實(shí)現(xiàn)過程;
缺點(diǎn)
- 產(chǎn)品必須有共同點(diǎn)姐叁,范圍有限制挠唆;
- 內(nèi)部變化復(fù)雜碧库,會有很多建造類弄匕;
代碼解釋
- 以蓋房子為例,創(chuàng)建一個產(chǎn)品房子延曙,構(gòu)建房子的過程
/**
* 創(chuàng)建一個產(chǎn)品:房子,構(gòu)建蓋房子的過程
* @author ws
* @version 1.0
*/
public class House {
List<String> parts=new ArrayList<>();
public void Add(String part){
parts.add(part);
}
public void show(){
System.out.println("蓋房子開始:");
for (String part:parts) {
System.out.println(part);
}
}
}
- 聲明蓋房子的抽象類,明確蓋房子的三個過程
/**
* 構(gòu)建抽象類儒溉,聲明三個構(gòu)建過程
* @author ws
* @version 1.0
*/
public abstract class Builder {
public abstract void builderOne();
public abstract void builderTwo();
public abstract void builderThree();
public abstract House getResult();
}
- 創(chuàng)建一個磚頭房的實(shí)現(xiàn)類,繼承蓋房子
/**
*磚房
* @author ws
* @version 1.0
*/
public class BrickHouse extends Builder {
private House house=new House();
@Override
public void builderOne() {
house.Add("打地基");
}
@Override
public void builderTwo() {
house.Add("砌磚");
}
@Override
public void builderThree() {
house.Add("上梁");
}
@Override
public House getResult() {
return house;
}
}
- 創(chuàng)建一個商砼房的實(shí)現(xiàn)類,繼承蓋房子
/**
* 混凝土房
* @author 1.0
* @version 1.0
*/
public class ConcreteHourse extends Builder {
private House house=new House();
@Override
public void builderOne() {
house.Add("打地基");
}
@Override
public void builderTwo() {
house.Add("拌混凝土");
}
@Override
public void builderThree() {
house.Add("澆灌");
}
@Override
public House getResult() {
return house;
}
}
- 創(chuàng)建一個工頭類,由工頭指揮蓋房子
/**
* 工頭指揮蓋房子,用來指揮蓋房子的過程
* @author ws
* @version 1.0
*/
public class Foreman {
public void construct(Builder builder){
builder.builderOne();
builder.builderTwo();
builder.builderThree();
}
}
- 測試類
public static void main(String[] args) {
Foreman foreman=new Foreman();
Builder brick=new BrickHouse();
Builder concrtet=new ConcreteHourse();
//蓋磚房
foreman.construct(brick);
House brickHourse=brick.getResult();
brickHourse.show();
//蓋混凝土房
foreman.construct(concrtet);
House concreteHourse=concrtet.getResult();
concreteHourse.show();
}
蓋房子開始:
打地基
砌磚
上梁
蓋房子開始:
打地基
拌混凝土
澆灌
參照:大話設(shè)計模式