设计模式之生成器模式(Java实现)

Builder (生成器)

一、意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

二、结构

生成器模式的结构如图7-26所示。

在这里插入图片描述
其中:
• Builder为创建一个Product对象的各个部件指定抽象接口。
• ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
• Diiector构造一个使用Builder接口的对象。
• Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。

三、适用性

Builder模式适用于:
• 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
• 当构造过程必须允许被构造的对象有不同的表示时。

四、实现

某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程,得到如图 6-1 所示的类图。
在这里插入图片描述
首先定义披萨实体

class Pizza{
	private String parts;
	public void setParts(String parts){ 
		this.parts = parts; 
	}
	public String toString(){
		return this.parts; 
	}
}

然后定义一个抽象生成器以及两种具体生成器

abstract class PizzaBuilder{
	protected Pizza pizza;
	public Pizza getPizza(){
		return pizza; 
	}
	public void createNewPizza(){
		pizza = new Pizza(); 
	}
	public abstract void buildParts() ;
}

class HawaiianPizzaBuilder extends PizzaBuilder{
	public void buildParts(){
		pizza.setParts("cross + mild + ham&pineapp1e");
	}
}

class SpicyPizzaBuilder extends PizzaBuilder{
	public void buildParts(){
		pizza.setParts("panbaked + hot + pepperoni&salami");
	}
}

其次 定义服务员实体

class Waiter{
	private PizzaBuilder pizzaBuilder;
	public void setPizzaBuilder(PizzaBuilder pizzaBuilder){
		/*设置构建器*/
	this.pizzaBuilder = pizzaBuilder;
	}
	public Pizza getPizza(){ 
		return pizzaBuilder.getPizza();
	}
	public void construct(){ 
		/* 构建 */
		pizzaBuilder.createNewPizza();
		pizzaBuilder.buildParts();
	}
}

最后 测试一下

public class Builder {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Waiter waiter = new Waiter();
		PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
		waiter.setPizzaBuilder(hawaiian_pizzabuilder);
		waiter.construct();
		System.out.println("pizza:" + waiter.getPizza());
		System.out.println("=========================================");
		PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
		waiter.setPizzaBuilder(spicy_pizzabuilder);
		waiter.construct();
		System.out.println("pizza:" + waiter.getPizza());
	}

}

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值