设计模式:建造者模式
建造者模式的主要特征是它包含一个逐步处理的步骤来创建东西,也就是说,虽然每一步的实现是不同的但是创建对象的过程都遵循相同的步骤。
1、建造者模式类图
2、代码实例
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;
}
}
//抽象建造者
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();
}
// 创建Tea的具体建造者
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");
}
}
// 具体的创建Coffee的建造者
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");
}
}
//服务员封装了建造者StarbucksBuilder
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();
//Alternatively you can use tea builder to build a tea
//StarbucksBuilder teaBuilder = new TeaBuilder();
waiter.setStarbucksBuilder(coffeeBuilder);
waiter.constructStarbucks();
//get the drink built
Starbucks drink = waiter.getstarbucksDrink();
}
}
3、建造者模式实际应用
建造者模式运用的地方非常多,下面就是在Java核心库的例子:
StringBuilder strBuilder= new StringBuilder();
strBuilder.append("one");
strBuilder.append("two");
strBuilder.append("three");
String str= strBuilder.toString();
append()方法就像我们Starbucks例子中的一个步骤,toString()方法则是最后一步。从上面的描述我们可以轻易的知道String是不可改变的类 。StringBuiler集成自AbstractStringBuilder,这个类更能体现出建造者模式。
4、建造者模式与工厂模式的区别
在创建一个对象需要很多步骤的时候,我们使用建造者模式。而当我们简单地调用一个方法就能创建出整个对象实例的时候采用工厂模式。