什么是建造者模式
又稱創(chuàng)造者模式坏为,將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示镊绪;隱藏了復(fù)雜對(duì)象的創(chuàng)建過(guò)程匀伏,它把復(fù)雜對(duì)象的創(chuàng)建過(guò)程加以抽象,通過(guò)子類或重載的方式蝴韭,動(dòng)態(tài)的創(chuàng)建具復(fù)合屬性的對(duì)象够颠。
簡(jiǎn)單解釋
使用創(chuàng)建者模式,用戶只需要指定需要建造的類型就可以得到榄鉴,而不知道具體的建造細(xì)節(jié)履磨;
UML類圖
image
優(yōu)點(diǎn)
- 建造者獨(dú)立,易擴(kuò)展;
- 便于細(xì)節(jié)控制風(fēng)險(xiǎn);
- 隱藏了具體的實(shí)現(xiàn)過(guò)程庆尘;
缺點(diǎn)
- 產(chǎn)品必須有共同點(diǎn)剃诅,范圍有限制;
- 內(nèi)部變化復(fù)雜驶忌,會(huì)有很多建造類矛辕;
代碼解釋
- 以蓋房子為例,創(chuàng)建一個(gè)產(chǎn)品房子付魔,構(gòu)建房子的過(guò)程
/**
* 創(chuàng)建一個(gè)產(chǎn)品:房子聊品,構(gòu)建蓋房子的過(guò)程
* @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("蓋房子開(kāi)始:");
for (String part:parts) {
System.out.println(part);
}
}
}
- 聲明蓋房子的抽象類,明確蓋房子的三個(gè)過(guò)程
/**
* 構(gòu)建抽象類几苍,聲明三個(gè)構(gòu)建過(guò)程
* @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)建一個(gè)磚頭房的實(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)建一個(gè)商砼房的實(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)建一個(gè)工頭類妻坝,由工頭指揮蓋房子
/**
* 工頭指揮蓋房子,用來(lái)指揮蓋房子的過(guò)程
* @author ws
* @version 1.0
*/
public class Foreman {
public void construct(Builder builder){
builder.builderOne();
builder.builderTwo();
builder.builderThree();
}
}
- 測(cè)試類
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();
}
蓋房子開(kāi)始:
打地基
砌磚
上梁
蓋房子開(kāi)始:
打地基
拌混凝土
澆灌
參照:大話設(shè)計(jì)模式