建造者模式
建造者模式就是一步一步的創(chuàng)建一個(gè)復(fù)雜的對象,而且允許用戶指定復(fù)雜對象的類型和內(nèi)容。
Builder 類是一個(gè)抽象類,用于定義一些創(chuàng)建子部件的方法,Builder類中應(yīng)該還有一個(gè) getResult() 方法,用于將創(chuàng)建好的部件組裝成一個(gè)產(chǎn)品返回。
Director 類又稱為指揮者,用于安排復(fù)雜對象的建造次序,通過construct() 方法,指導(dǎo)Builder類完成組裝。
通過一個(gè)例子來更好的理解建造者模式,比如說現(xiàn)在的手機(jī)都支持更換主題,所有的主題建造過程都是類似的,比如說更換圖標(biāo),背景,提示音,那么這個(gè)時(shí)候就可以通過建造者模式來完成這一過程。
先來設(shè)計(jì)一下Product和Builder類
public class Product {
private String mBackground;
private String mIcon;
private String mSounds;
public String getBackground() {
return mBackground;
}
public void setBackground(String background) {
mBackground = background;
}
public String getIcon() {
return mIcon;
}
public void setIcon(String icon) {
mIcon = icon;
}
public String getSounds() {
return mSounds;
}
public void setSounds(String sounds) {
mSounds = sounds;
}
}
public abstract class Builder {
private Product mProduct = new Product();
public Product getResult(){
return mProduct;
}
public abstract void buildBackground();
public abstract void buildIcon();
public abstract void buildSounds();
}
可見,不論什么樣的主題,以上代碼都是通用的,對于不同的主題,只需要在ConcreteBuilder中進(jìn)行設(shè)置就可以了。
public class ConcreteBuilder extends Builder{
public void buildBackground(){
mProduct.setBackground("Black");
}
public void buildIcon(){
mProduct.setIcon("MyIcon");
}
public void buildSounds(){
mProduct.setSounds("MySounds");
}
}
既然產(chǎn)品生產(chǎn)過程已經(jīng)構(gòu)建出來了,那么就到了Director 類發(fā)揮作用的時(shí)候了,現(xiàn)在就由Director 來指揮各個(gè)部件的創(chuàng)造,并且將組裝好的產(chǎn)品返回給客戶端。
public class Director {
public Product construct(Builder builder){
builder.buildBackground();
builder.buildIcon();
builder.buildSounds();
return builder.getResult();
}
}
可見Director 類中只有一個(gè)簡單的方法,有的時(shí)候當(dāng)產(chǎn)品的部件不是很多的時(shí)候,完全可以將該方法放到Builder類中,從而省略Director 類。
已經(jīng)看出,建造者模式和抽象工廠模式很類似。其實(shí),抽象工廠模式更側(cè)重于生產(chǎn) “部件” , 而建造者模式側(cè)重于將各個(gè) 部件組裝成一個(gè)產(chǎn)品。