建造者模式

目的

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,就像造房子,需要一砖一瓦地搭建。

一个 Builder 类独立于相关类,会一步一步构造最终的对象。

解释

由于构造方法可能十分复杂,或者存在比较复杂的依赖,这时候在构造方法中实现会显得代码容易出bug,这时候将构造方法独立出来可以降低程序耦合度。不过与工厂方法不同,建造者模式更强调次序

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

示例

案例-KFC

KFC套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。UML类图如下,编码实现以上功能。

此案例包含四种角色:复杂产品类 Meal、抽象建造者类 MealBuilder、若干 具体建造者类指挥者类

UML 图

img

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);  
    }

img