建造者模式的关键特征是他涉及一个逐步的过程去构建东西。例如,每个产品会通过相同的过程,不同的是过程中的步骤不同。 在下面的例子中,我们能定义一个饮料的建造者叫StarbuscksBuilder,他将通过一系列的步骤来建造一杯叫Starbucks的饮料,像buildSize()方法和buildDrink方法,最后会返回已建造的饮料。
建造者模式类图
建造者模式Java代码
1package designpatterns.builder; // produce to be builtclass Starbucks { private String size; private String drink; public void setSize(String size) { this.size = size; } public void setDrink(String drink) { this.drink = drink; }} //abstract builderabstract 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();} // Concrete Builder to build teaclass 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"); } } // Concrete builder to build coffeeclass 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"); }} //director to encapsulate the builderclass 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(); }} //customerpublic 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(); }}
在java标准库中,StringBuilder 继承了 AbstractStringBuilder
StringBuilder strBuilder= new StringBuilder();strBuilder.append("one");strBuilder.append("two");strBuilder.append("three");String str= strBuilder.toString();
这个append()是过程中的一步,就像在Starbucks例子中的一步,toString()方法是最后一步,但是不同的是这是没有图中的waiter,在上图的建造者模式中waiter类扮演了一个导演的角色,但是这是没有这样的角色,所以他不是建造者模式。 当然,这不是唯一的原因,我们能对比类图的开始,并找到其他原因。 建造者模式用于,当需要许多步来构造一个对象,工厂模式用于,当很容易在一个方法中就构建一个实体对象。
以上文章翻译自: