建造者模式的关键特性是它将一个建造过程分解成很多步骤,也可以说,每个产品的建造会遵循同样的流程,不过流程内的每一个步骤都不尽相同。
在下面这个故事里,我们会定义一个叫作星巴克饮料机(StarbucksBuilder)的机器,用于制造星巴克饮料。StarbucksBuilder要经过很多步骤来做一杯饮料,比如buildSize() 和 buildDrink(),并且最终返回制成的饮料。
1. 建造者设计模式类图
2. 建造者模式Java示例代码
package designpatterns.builder;
// 待构建产品
class Starbucks {
private String size;
private String drink;
public void setSize(String size) {
this.size = size;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
//抽象builder
abstract class StarbucksBuilder {
protected Starbucks starbucks;
public Starbucks getStarbucks() {
return starbucks;
}
public void createStarbucks() {
starbucks = new Starbucks();
System.out.println("a drink is created");
}
public abstract void buildSize();
public abstract void buildDrink();
}
// 泡茶builder
class TeaBuilder extends StarbucksBuilder {
public void buildSize() {
starbucks.setSize("large");
System.out.println("build large size");
}
public void buildDrink() {
starbucks.setDrink("tea");
System.out.println("build tea");
}
}
// 泡咖啡builder
class CoffeeBuilder extends StarbucksBuilder {
public void buildSize() {
starbucks.setSize("medium");
System.out.println("build medium size");
}
public void buildDrink() {
starbucks.setDrink("coffee");
System.out.println("build coffee");
}
}
//指导如何封装builder
class Waiter {
private StarbucksBuilder starbucksBuilder;
public void setStarbucksBuilder(StarbucksBuilder builder) {
starbucksBuilder = builder;
}
public Starbucks getstarbucksDrink() {
return starbucksBuilder.getStarbucks();
}
public void constructStarbucks() {
starbucksBuilder.createStarbucks();
starbucksBuilder.buildDrink();
starbucksBuilder.buildSize();
}
}
//客户
public class Customer {
public static void main(String[] args) {
Waiter waiter = new Waiter();
StarbucksBuilder coffeeBuilder = new CoffeeBuilder();
//也可以用泡茶builder沏茶
//StarbucksBuilder teaBuilder = new TeaBuilder();
waiter.setStarbucksBuilder(coffeeBuilder);
waiter.constructStarbucks();
//取到饮料
Starbucks drink = waiter.getstarbucksDrink();
}
}
3. 建造者模式和工厂模式的区别
当创造一个对象需要很多步骤时适合使用建造者模式。而当只需调用一个方法就可以简单地创建整个对象时适合使用工厂模式。
4. 建造者模式的实际应用例子
很多类库都有使用建造者模式,下面这个例子来自于Java核心:
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("one");
strBuilder.append("two");
strBuilder.append("three");
String str= strBuilder.toString();
append()方法类似于星巴克例子中的一个步骤,toString()方法是其中的最后一步。String为何是不可变的。
系统全貌比较复杂,不过继承自AbstractStringBuilder的StringBuilder,正是上面所说的建造者模式。