見名之意,建造者就是用來建造對象的嘛!不過...等等,我們先前不是有工廠模式嗎?我記得工廠模式也是用來創建對象的阿? 彆着急,聽我說!
我們得將這兩種模式區分一下,工廠模式是用來創建一個對象,它只初始化對象必須具備的屬性,而建造者模式呢,是在創建完對象的基礎上,再對對象進行一系列操作從而拿到更加完善的對象! 就比如造房子,工廠模式就像是提供一個地基,而通過建造者模式,我們可以在有地基的基礎上,再進行砌磚,打樑,蓋瓦...等等操作最終得到一個房子!
現在我們試想一下,如果需要你來組裝一臺電腦,你需要先插好主板,再裝上CPU,然後是顯卡,電源,內存...等等,然而,你可能犯迷糊了,忘記裝上內存...那你的電腦可就無法正常運行了!當不同的人去組裝電腦時,都有可能忘記做某事而導致電腦無法正常開機, 這在我們程序裏面表示的就是,構建某一個對象,然而忘記了某個步驟,導致最終形成的對象與期待不相匹配! 就比如構建一個遊戲人物,然而忘記繪製雙手...這就很尷尬了!
所以,我們需要某種方式,通過這種方式可以標準化的構建某個對象,那麼這種構建對象的方式,就稱爲建造者模式!
OK,這個模式很簡答, 就不多說了,直接讓代碼擼起來!
//抽象電腦類,這些步驟也是有順序的,不能讓客戶端瞎搞
//總不能主板好沒裝就插內存條吧?往哪插?
abstract class AbstractComputer{
abstract void addMainBoard();//安裝主板
abstract void addCPU();//安裝CPU
abstract void addGraphics();//安裝顯卡
abstract void addPower();//安裝電源
abstract void addMemory();//安裝內存條
abstract void joints();//將各部件的插線連接好
}
//一臺聯想電腦
class ThinkComputer extends AbstractComputer{
@Override
void addMainBoard() {
System.out.println("安裝好聯想牌主板");
}
@Override
void addCPU() {
System.out.println("安裝好聯想牌CPU");
}
@Override
void addGraphics() {
System.out.println("安裝好聯想牌顯卡");
}
@Override
void addPower() {
System.out.println("安裝好聯想牌電源");
}
@Override
void addMemory() {
System.out.println("安裝好聯想牌內存");
}
@Override
void joints() {
System.out.println("將聯想牌電腦插線全部插好");
}
}
//一臺華碩電腦
class AsusComputer extends AbstractComputer{
@Override
void addMainBoard() {
System.out.println("安裝好華碩牌主板");
}
@Override
void addCPU() {
System.out.println("安裝好華碩牌CPU");
}
@Override
void addGraphics() {
System.out.println("安裝好華碩牌顯卡");
}
@Override
void addPower() {
System.out.println("安裝好華碩牌電源");
}
@Override
void addMemory() {
System.out.println("安裝好華碩牌內存");
}
@Override
void joints() {
System.out.println("將華碩牌電腦插線全部插好");
}
}
//構建者對象,可以標準化,流程化構建電腦對象,客戶端不需要知道一臺電腦具體該怎麼組裝,
//只要告知構建者要組裝的電腦,它就能正確的對其進行組裝!
class ComputerBuilder{
public AbstractComputer buildComputer(AbstractComputer ac){
ac.addMainBoard();
ac.addCPU();
ac.addGraphics();
ac.addPower();
ac.addMemory();
ac.joints();
return ac;
}
}
public class Test {
public static void main(String[] args) {
AbstractComputer acThink = new ThinkComputer();
AbstractComputer acAsuc = new AsusComputer();
ComputerBuilder cb = new ComputerBuilder();
//讓構建者構建好聯想電腦;
acThink = cb.buildComputer(acThink);
System.out.println("********************************");
acAsuc = cb.buildComputer(acAsuc);
}
}
安裝好聯想牌主板
安裝好聯想牌CPU
安裝好聯想牌顯卡
安裝好聯想牌電源
安裝好聯想牌內存
將聯想牌電腦插線全部插好
********************************
安裝好華碩牌主板
安裝好華碩牌CPU
安裝好華碩牌顯卡
安裝好華碩牌電源
安裝好華碩牌內存
將華碩牌電腦插線全部插好
**********************************************************
是不是很簡單啦!