讲故事,学(Java)设计模式—建造者模式

本文由 @胡试之 校稿。如果你也希望参与类似的系列文章翻译,可以加入我们的 Java开发技术翻译 小组。

建造者模式的关键特性是它将一个建造过程分解成很多步骤,也可以说,每个产品的建造会遵循同样的流程,不过流程内的每一个步骤都不尽相同。

在下面这个故事里,我们会定义一个叫作星巴克饮料机(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、建造者模式的实际用法

建造者模式在很多库中都有广泛的应用。然而有很多人都犯了同样的错误:看看下面来自Java标准类库中的StringBuilder,它是建造者模式吗?

StringBuilder strBuilder= new StringBuilder();
strBuilder.append("one");
strBuilder.append("two");
strBuilder.append("three");
String str= strBuilder.toString();

在Java标准类库中,StringBuilder继承了AbstractStringBuilder。

append()方法是其中一个步骤,就像Starbucks中的一个步骤一样。toString()方法是另一个步骤,而且是最后一个。但是这里缺少上图中waiter。Waiter类在建造者模式扮演指挥的角色。正是因为这里缺少这样的一个角色,所以StringBuilder并不是标准的建造者模式。

当然这不是唯一的原因,你可以比较文章开始的类图,你会发现另一个原因。

4、建造者模式和工厂模式的区别

当创造一个对象需要很多步骤时适合使用建造者模式。而当只需调用一个方法就可以简单地创建整个对象时适合使用工厂模式。

原文链接: programcreek 翻译: ImportNew.com - 顾星竹
译文链接: http://www.importnew.com/6841.html
[ 转载请保留原文出处、译者和译文链接。]



相关文章

发表评论

Comment form

(*) 表示必填项

2 条评论

  1. ninjame 说道:

    翻译最后有点问题
    However, there is a common mistake here. Consider the following example of StringBuilder which is a class from Java standard library. Does it utilize the Builder pattern?

    The Waiter class plays the director role in the picture of the Builder pattern. Since there is no such role, it is not a Builder pattern.

    StringBuilder并不是使用该设计模式

    Thumb up 0 Thumb down 0

跳到底部
返回顶部