定義:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
使用場景:
創建的產品有複雜的內部結構,且創建的產品有較多的共同點,其組成部分相似。隔離複雜對象的創建,使得相同的過程可以創建不同的產品。
與抽象工廠的區別:
在建造者模式裏,有個指導者,由指導者來管理創造者,用戶是與指導者聯繫的,指導者聯繫創建者得到最後的產品。
角色:
Builder:一個抽象接口,用於規範定義複雜對象的組成部分。
ConcreteBuilder:實現Builder接口,具體化複雜對象的各個部分的創建。
Director:指導者角色,調用具體建造者來創建複雜對象的各個部分。
Product:要創建的複雜對象。
這裏以一個KFC點餐的案例作爲例子,代碼如下,僅供參考:
產品類定義
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
建造者抽象類定義
public abstract class Builder {
abstract void buildFood();
abstract void buildDrink();
public Meal getResult(){
return new Meal();
}
}
具體建造者定義
public class MealBuilderA extends Builder{
public void buildFood(){
System.out.println("一個漢堡!");
}
public void buildDrink(){
System.out.println("一杯可樂!");
}
}
public class MealBuilderB extends Builder{
public void buildFood(){
System.out.println("三個雞翅!");
}
public void buildDrink(){
System.out.println("一杯奶茶!");
}
}
指導者類定義
public class Director {
private Builder builder;
public void setBuilder(Builder builder) {
this.builder = builder;
}
public Meal construct(){
builder.buildFood();
builder.buildDrink();
return builder.getResult();
}
}
客戶端類定義
public static void main(String[] args){
//創建指導者
Director director = new Director();
System.out.println("========套餐A==========");
//建造者A
Builder builderA = new MealBuilderA();
director.setBuilder(builderA);
//返回套餐A
director.construct();
System.out.println("========套餐B==========");
//建造者B
Builder builderB = new MealBuilderB();
director.setBuilder(builderB);
//返回套餐B
director.construct();
}
參考文章:http://blog.csdn.net/chenssy/article/details/11354661