定義:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
依然是來個例子
首先是我們要構建的產品,包含一個添加方法與顯示方法
public class Product
{
private List<String> parts = new ArrayList<String>();
public void add(String part)
{
this.parts.add(part);
}
public void show()
{
System.out.println("\n產品創建---");
for (String string : this.parts)
{
System.out.println(string);
}
}
}
然後是個建造者類,這是個虛類,所有方法都是虛的,子類必須實現所有方法才行,這就避免了在實際創建時缺少某些步驟的情況
public abstract class Builder
{
abstract public void bilderPartA();
abstract public void bilderPartB();
abstract public Product getResult();
}
第一個具體類,實現父類的方法,也就是給產品加些字符串,也是在實際代碼中給產品增加的新內容
public class ConcreteBuilder1 extends Builder
{
private Product product = new Product();
@Override
public void bilderPartA()
{
this.product.add("部件A");
}
@Override
public void bilderPartB()
{
this.product.add("部件B");
}
@Override
public Product getResult()
{
return this.product;
}
}
第二個子類,同上
public class ConcreteBuilder2 extends Builder
{
private Product product = new Product();
@Override
public void bilderPartA()
{
this.product.add("部件K");
}
@Override
public void bilderPartB()
{
this.product.add("部件L");
}
@Override
public Product getResult()
{
return this.product;
}
}
指揮官,這牛逼角色,控制着構建過程,
public class Director
{
public void construct(Builder builder)
{
builder.bilderPartA();
builder.bilderPartB();
}
}
客戶端就很簡單了,感覺與前面的幾種模式有很大的相同點
public class BuilderMain
{
public static void main(String[] args)
{
Director director = new Director();
Builder builder = new ConcreteBuilder1();
director.construct(builder);
Product p1 = builder.getResult();
p1.show();
builder = new ConcreteBuilder2();
director.construct(builder);
Product p2 = builder.getResult();
p2.show();
}
}
總結:這個模式主要用在那些構建細節比較複雜,構建過程又比較單一,可以將這個過程總結出來,放到父類中強制子類實現;指揮官的角色會保證構建過程的完整。