GOF 給建造模式的定義爲:將一個複雜對象的構建與它的表示分離,使得一樣的構建 過程能夠建立不一樣的表示。這句話說得很抽象,很差理解,其實它的意思能夠理解爲:將構 造複雜對象的過程和組成對象的部件解耦。
就像組裝的電腦同樣,無論什麼品牌的配件,只要兼 容就能夠裝上;一樣,同樣的配件,能夠有好多組裝的方式。這是對下降耦合、提升可複用 性精神的一種貫徹。設計模式
當要生成的產品有複雜的內部結構——好比由多個對象組成;而系統中對此產品的需求 未來可能要改變產品對象的內部結構的構成,好比說產品的一些屬性如今由一個小對象組 成,而更改後的型號可能須要 N 個小對象組成;並且不能將產品的內部構造徹底暴露給客 戶程序,一是爲了可用性,二是爲了安全等因素。知足上面的設計環境就能夠考慮使用建造 模式來搭建框架了。安全
建造模式的組成:bash
這裏以一個簡單的iphone6的生產爲例
iphone實體類框架
public class Iphone6 {
private Cell cell; //電池
private Screen screen; //屏幕
private Mainboard mainboard; //主板
public void open() {
System.out.println("手機開機");
}
public Cell getCell() {
return cell;
}
public void setCell(Cell cell) {
this.cell = cell;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
public Mainboard getMainboard() {
return mainboard;
}
public void setMainboard(Mainboard mainboard) {
this.mainboard = mainboard;
}
}
//電池類
class Cell{
private String name;
public Cell(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//電池類
class Screen{
private String name;
public Screen(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//主板類
class Mainboard{
private String name;
public Mainboard(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
複製代碼
指導者接口iphone
//指導者
public interface Iphone6Director {
Iphone6 dircectIphone6();
}
複製代碼
構造者接口ide
//構造者抽象類
public interface Iphone6Builder {
//構建自組建
Cell builderCell();
Screen builderScreen();
Mainboard builderMainboard();
}
複製代碼
構造者實現類--用來建立複雜對象各個組件測試
public class MyIphone6Builder implements Iphone6Builder{
@Override
public Cell builderCell() {
// TODO Auto-generated method stub
System.out.println("構建屏幕");
//也能夠與工廠模式或單例模式相結合
return new Cell("iphone6的屏幕");
}
@Override
public Screen builderScreen() {
// TODO Auto-generated method stub
System.out.println("構建電池");
return new Screen("iphone6的電池");
}
@Override
public Mainboard builderMainboard() {
// TODO Auto-generated method stub
System.out.println("構建主板");
return new Mainboard("iphone6的主板");
}
}
複製代碼
指導者實現類--負責安排各個組件的建造順序ui
public class MyIphone6Director implements Iphone6Director{
private MyIphone6Builder builder;
public MyIphone6Director(MyIphone6Builder builder) {
this.builder = builder;
}
@Override
public Iphone6 dircectIphone6() {
// TODO Auto-generated method stub
Cell cell = builder.builderCell();
Mainboard mainboard = builder.builderMainboard();
Screen screen = builder.builderScreen();
//裝配成iphone6
Iphone6 iphone6 = new Iphone6();
iphone6.setCell(cell);
iphone6.setMainboard(mainboard);
iphone6.setScreen(screen);
return iphone6;
}
}
複製代碼
測試類this
public class TestIphone {
public static void main(String[] args) {
MyIphone6Director director = new MyIphone6Director(new MyIphone6Builder());
Iphone6 iphone6 = director.dircectIphone6();
iphone6.open();
}
}
複製代碼
最終一臺iphone手機就被組將建造出來了:
構建屏幕
構建主板
構建電池
手機開機spa
建造模式中極可能要用到組成成品的各類組件類,對於這些類的建立能夠考慮使用工廠 方法或者原型模式來實現,在必要的時候也能夠加上單例模式來控制類實例的產生。可是要 堅持一個大前提就是要使引入的模式給你的系統帶來好處,而不是臃腫的結構。
建造模式在獲得複雜產品的時候可能要引用多個不一樣的組件,在這一點上來看,建造模 式和抽象工廠模式是類似的。能夠從如下兩點來區分二者:建立模式着重於逐步將組件裝配 成一個成品並向外提供成品,而抽象工廠模式着重於獲得產品族中相關的多個產品對象;抽 象工廠模式的應用是受限於產品族的,建造模式則不會。
還可參考:
Java設計模式之構造者模式,你真正瞭解過嗎