建造者模式
我們前面學習了工廠方法模式和抽象工廠模式,知道了對象的創建可以轉移到別的類中創建,那麼如果要創建比較複雜的對象,但是創建的過程有一定的規律性,比如建房子,搭橋等有一定模式的,那麼我們可以用到建造者模式。
定義
將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
使用場景
1. 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2. 當構造過程必須允許被構造的對象有不同的表示時。
結構
實現
Product類的實現
public class Product {
private String title;
private String string;
private String item;
public void setTitle(String title) {
this.title = title;
}
public void setString(String string) {
this.string = string;
}
public void setItem(String item) {
this.item = item;
}
}
Builder接口的設計
public interface Builder {
void makeTitle();
void makeString();
void makeItem();
Product getResult();
}
具體的Builder的實現
public class HTMLBuilder implements Builder{
private Product htmlproduct;
public void makeTitle() {
htmlproduct.setTitle("htmlTitle");
}
public void makeString() {
htmlproduct.setString("htmlString");
}
public void makeItem() {
htmlproduct.setItem("htmlItem");
}
public Product getResult() {
return htmlproduct;
}
}
public class TextBuilder implements Builder{
private Product textproduct;
public void makeTitle() {
textproduct.setTitle("textTitle");
}
public void makeString() {
textproduct.setString("textString");
}
public void makeItem() {
textproduct.setItem("textItem");
}
public Product getResult() {
return textproduct;
}
}
Diector類的實現
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public void construct() {
builder.makeTitle();
builder.makeString();
builder.makeItem();
}
}
我們來測試一下
public class BuilderTest {
public static void main(String[] args) {
Builder htmlbuilder = new HTMLBuilder();
Director director = new Director(htmlbuilder);
director.construct();
Product product = htmlbuilder.getResult();
}
}
建造者模式相比於抽象工廠模式和工廠方法模式,可以創建更加複雜的對象,實際生產中java mail應用的建造者模式來創建郵件的各個部分,有興趣的朋友可以去看看源碼,加深理解。