建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。將一個復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
優(yōu)點
- 建造者獨立,易擴(kuò)展。
- 便于控制細(xì)節(jié)風(fēng)險。
缺點
- 產(chǎn)品必須有共同點,范圍有限制。
- 如內(nèi)部變化復(fù)雜,會有很多的建造類。
角色介紹
建造者模式有四個角色:
-
Product(產(chǎn)品類):要建造的對象 -
builder(抽象建造者):規(guī)范建造對象的組成成分,但不具體創(chuàng)建。 -
ConcreteBuilder(具體建造者):根據(jù)抽象建造者規(guī)范的組成成分來具體創(chuàng)建,并返回建造對象(產(chǎn)品類)實例。 -
Director(指導(dǎo)者):調(diào)用具體建造者來建造各個部分,指導(dǎo)者只需要關(guān)注建造順序,而不需要關(guān)注各成分(產(chǎn)品類屬性)具體信息。
執(zhí)行順序:
Director->builder->ConcreteBuilder
最后返回Product
產(chǎn)品類
要建造的對象
public class Phone {
/**
* 處理器
*/
private String cpu;
/**
* 屏幕
*/
private String screen;
/**
* 相機(jī)
*/
private String camera;
getter and setter...
抽象建造者
規(guī)范建造對象的組成成分,但不具體創(chuàng)建。
public interface PhoneBuilder {
void buildScreen();
void buildCpu();
void buildCamera();
Phone buildPhone();
}
具體建造者
根據(jù)抽象建造者規(guī)范的組成成分來具體創(chuàng)建,并返回建造對象(產(chǎn)品類)實例。
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;
}
}
指導(dǎo)者
調(diào)用具體建造者來建造各個部分,指導(dǎo)者只需要關(guān)注建造順序,而不需要關(guān)注各成分(產(chǎn)品類屬性)具體信息。
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'}
與抽象工廠模式區(qū)別
建造者模式和抽象工廠模式是很像的(都是創(chuàng)建產(chǎn)品類實例),建造者模式比它多了一個指導(dǎo)者的角色,所以它們的最大區(qū)別在于:
建造者模式只需要關(guān)注產(chǎn)品類建造的順序,而不需要關(guān)注其具體信息。
而抽象工廠模式需要關(guān)注其具體信息去創(chuàng)建產(chǎn)品類。
抽象工廠模式順風(fēng)車:設(shè)計模式快速學(xué)習(xí)(二)抽象工廠模式