建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。
優點
- 建造者獨立,易擴充套件。
- 便於控制細節風險。
缺點
- 產品必須有共同點,範圍有限制。
- 如內部變化複雜,會有很多的建造類。
角色介紹
建造者模式有四個角色:
Product(產品類)
:要建造的物件builder(抽象建造者)
:規範建造物件的組成成分,但不具體建立。ConcreteBuilder(具體建造者)
:根據抽象建造者規範的組成成分來具體建立,並返回建造物件(產品類)例項。Director(指導者)
:呼叫具體建造者來建造各個部分,指導者只需要關注建造順序,而不需要關注各成分(產品類屬性)具體資訊。
執行順序:
Director->builder->ConcreteBuilder
最後返回Product
產品類
要建造的物件
public class Phone {
/**
* 處理器
*/
private String cpu;
/**
* 螢幕
*/
private String screen;
/**
* 相機
*/
private String camera;
getter and setter...
複製程式碼
抽象建造者
規範建造物件的組成成分,但不具體建立。
public interface PhoneBuilder {
void buildScreen();
void buildCpu();
void buildCamera();
Phone buildPhone();
}
複製程式碼
具體建造者
根據抽象建造者規範的組成成分來具體建立,並返回建造物件(產品類)例項。
public class ConcreteBuilder implements PhoneBuilder{
public Phone phone;
public ConcreteBuilder() {
phone = new Phone();
}
@Override
public void buildScreen() {
phone.setScreen("三星OLED螢幕");
}
@Override
public void buildCpu() {
phone.setCpu("驍龍845");
}
@Override
public void buildCamera() {
phone.setCamera("SONY");
}
@Override
public Phone buildPhone() {
return this.phone;
}
}
複製程式碼
指導者
呼叫具體建造者來建造各個部分,指導者只需要關注建造順序,而不需要關注各成分(產品類屬性)具體資訊。
public class Direct {
public Phone constructMi8(PhoneBuilder phoneBuilder){
phoneBuilder.buildCamera();
phoneBuilder.buildCpu();
phoneBuilder.buildScreen();
return phoneBuilder.buildPhone();
}
}
複製程式碼
測試
public class Main {
public static void main(String[] args) {
Direct direct = new Direct();
Phone phone = direct.constructMi8(new ConcreteBuilder());
System.out.println(phone);
}
}
複製程式碼
Phone{cpu='驍龍845', screen='三星OLED螢幕', camera='SONY'}
複製程式碼
與抽象工廠模式區別
建造者模式和抽象工廠模式是很像的(都是建立產品類例項),建造者模式比它多了一個指導者的角色,所以它們的最大區別在於:
建造者模式只需要關注產品類建造的順序,而不需要關注其具體資訊。
而抽象工廠模式需要關注其具體資訊去建立產品類。
抽象工廠模式順風車:設計模式快速學習(二)抽象工廠模式