建造者模式
目的
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,就像造房子,需要一砖一瓦地搭建。
一个 Builder 类独立于相关类,会一步一步构造最终的对象。
解释
由于构造方法可能十分复杂,或者存在比较复杂的依赖,这时候在构造方法中实现会显得代码容易出bug,这时候将构造方法独立出来可以降低程序耦合度。不过与工厂方法不同,建造者模式更强调次序
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
示例
案例-KFC
KFC套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。UML类图如下,编码实现以上功能。
此案例包含四种角色:复杂产品类 Meal、抽象建造者类 MealBuilder、若干 具体建造者类 和指挥者类
UML 图

Meal类
public class Meal {//food和drink是Meal(实体类)的组成部分
private String food;
private String drink;
public void setFood(String food) {
this.food = food;
}
public void setDrink(String drink) {
this.drink = drink;
}
public String getFood() {
return (this.food);
}
public String getDrink() {
return (this.drink);
}
}MealBuilder类
public abstract class MealBuilder {//抽象建造者
//组合Meal——new出来的对象
protected Meal meal=new Meal();
//抽象的构建方法
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal()
{
return meal;
}
}指挥者类
public class KFCWaiter {//指挥者
private MealBuilder mb;
//使用setter方法实例化具体建造者
public void setMealBuilder(MealBuilder mb)
{
this.mb=mb;
}
public Meal construct()
{
mb.buildFood();
mb.buildDrink();
return mb.getMeal();
}
}那么在给客户时只需要使用对应builder并传递给客户
案例:StringBuilder
StringBuilder 是Java专门用来创建字符串的库,你可以将新字符串添加到builder的尾部或者其他部分,在打印时会输出整个字符串:
public static void main(String args[]){
StringBuilder sb = new StringBuilder(10);
sb.append("Runoob..");
System.out.println(sb);
sb.append("!");
System.out.println(sb);
sb.insert(8, "Java");
System.out.println(sb);
sb.delete(5,8);
System.out.println(sb);
}