创建型模式之四:建造者模式
创建型模式之四:建造者模式
刀狂剑痴 发表于2年前
创建型模式之四:建造者模式
  • 发表于 2年前
  • 阅读 17
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

建造者模式的关键特征是他涉及一个逐步的过程去构建东西。例如,每个产品会通过相同的过程,不同的是过程中的步骤不同。 在下面的例子中,我们能定义一个饮料的建造者叫StarbuscksBuilder,他将通过一系列的步骤来建造一杯叫Starbucks的饮料,像buildSize()方法和buildDrink方法,最后会返回已建造的饮料。

建造者模式类图

建造者模式Java代码

1
package designpatterns.builder;
 
// produce to be built
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 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();
}
 
// Concrete Builder to build 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");
 }
 
}
 
// Concrete builder to build 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");
 }
}
 
//director to encapsulate the 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();
 }
}
 
//customer
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();
 
 }
}

在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类扮演了一个导演的角色,但是这是没有这样的角色,所以他不是建造者模式。 当然,这不是唯一的原因,我们能对比类图的开始,并找到其他原因。 建造者模式用于,当需要许多步来构造一个对象,工厂模式用于,当很容易在一个方法中就构建一个实体对象。 

以上文章翻译自: http://www.programcreek.com/2013/02/java-design-pattern-builder/

共有 人打赏支持
粉丝 18
博文 111
码字总数 82582
×
刀狂剑痴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: