设计模式(五):Builder模式

Builder模式主要解决的问题是:

分离复杂对象的构建过程(construction)和表示(representation),以使得相同的构建过程能够产生不同的表示。通常Builder模式会和Composite模式一起使用。



图中:
Builder是创建产品的抽象接口
ConcreteBuilder是Builder的具体实现,由它负责构建或者组装产品。
Director的职责就是控制对象创建过程,它接受一个ConcreteBuilder作为参数,并对其进行相应的操作。
Product就是被构建的复杂的对象。

就拿制作比萨饼为例,为了满足不同消费者的口味,比萨饼的用料,风味都是不同的,当时比萨饼的制造过程却是相同的。利用Builder模式提供的线索,我们可以认为比萨饼(Pizza)本身就是一个复杂对象,并且需要我们解决复杂对象的构建过程(制作比萨饼)和表示(不同用料,风味)进行分离,以便于相同的构建过程(制作比萨饼)能够产生出不同的表示(不同的用料,风味)。

在这里我们又清晰的看到了面向对象设计原则中的一条原则:“找出应用中变化的部分,并将它与不变的部分进行隔离”。

在此,制作比萨饼的过程是没有发生变化的,所以我们将它分离出来形成了Director,该类中的Constuct方法即为制作比萨饼的过程,这一过程是稳定的。

而对于比萨饼的用料和风味是变化的,这里 有HawaiianPizza和 SpicyPizza,以后还会随着比萨饼店的生意越来越好而推出更多不同用料和风味的比萨饼。 所以ConcreteBuilder是可以有多种的。

下面就来看java示例:

/** "Product" */
class  Pizza  {
  
private String dough = "";
  
private String sauce = "";
  
private String topping = "";

  
public void setDough (String dough)     this.dough = dough; }
  
public void setSauce (String sauce)     this.sauce = sauce; }
  
public void setTopping (String topping) this.topping = topping; }
}



/** "Abstract Builder" */
abstract   class  PizzaBuilder  {
  
protected Pizza pizza;

  
public Pizza getPizza() return pizza; }
  
public void createNewPizzaProduct() { pizza = new Pizza(); }

  
public abstract void buildDough();
  
public abstract void buildSauce();
  
public abstract void buildTopping();
}


/** "ConcreteBuilder" */
class  HawaiianPizzaBuilder  extends  PizzaBuilder  {
  
public void buildDough()   { pizza.setDough("cross"); }
  
public void buildSauce()   { pizza.setSauce("mild"); }
  
public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}


/** "ConcreteBuilder" */
class  SpicyPizzaBuilder  extends  PizzaBuilder  {
  
public void buildDough()   { pizza.setDough("pan baked"); }
  
public void buildSauce()   { pizza.setSauce("hot"); }
  
public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}



/** "Director" */
class  Waiter  {
  
private PizzaBuilder pizzaBuilder;

  
public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
  
public Pizza getPizza() return pizzaBuilder.getPizza(); }

  
public void constructPizza() {
    pizzaBuilder.createNewPizzaProduct();
    pizzaBuilder.buildDough();
    pizzaBuilder.buildSauce();
    pizzaBuilder.buildTopping();
  }

}


/** A customer ordering a pizza. */
class  BuilderExample  {
  
public static void main(String[] args) {
    Waiter waiter 
= new Waiter();
    PizzaBuilder hawaiianPizzaBuilder 
= new HawaiianPizzaBuilder();
    PizzaBuilder spicyPizzaBuilder 
= new SpicyPizzaBuilder();

    waiter.setPizzaBuilder ( hawaiianPizzaBuilder );
    waiter.constructPizza();

    Pizza pizza 
= waiter.getPizza();
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值