1.意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.结构
Builder为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
Director构造一个使用Builder接口的对象。
Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
3.适用性
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
4.常见案例:一个产品构造(组成不同)
代码案例一:
某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类披萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程。
软件设计师考试2017年上半年下午题第6题
public class Builder1 {
public static void main(String[] args) {
Waiter waiter = new Waiter();
//生产一个夏威夷披萨
PizzaBuilder huwaiianPizzaBuilder = new HawaiianPizzaBuilder();
waiter.setPizzaBuilder(huwaiianPizzaBuilder);
waiter.construct();
System.out.println("pizza:" + waiter.getPizza());
}
}
class Pizza{
private String parts;
public void setParts(String parts){
this.parts = parts;
}
public String getParts(){
return this.parts;
}
@Override
public String toString() {
return 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{//夏威夷披萨
@Override
public void buildParts() {
pizza.setParts("cross + mild + ham & pineapple");
}
}
class SpicyPizzaBuilder extends PizzaBuilder{//意大利披萨
@Override
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();
}
}
运行结果:
代码案例二:
生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
软件设计师考试2018年上半年下午题第6题
public class Builder2 {
public static void main(String[] args) {
Director director1 = new Director(new ConcreateBuilder1());
//产品1生产:partA1+partB1
director1.construct();
Director director2 = new Director(new ConcreateBuilder2());
//产品2生产:partA2+partB2
director2.construct();
}
}
class Product{
private String partA;
private String partB;
public Product(){
}
public void setPartA(String s){
partA = s;
}
public void setPartB(String s){
partB = s;
}
public String getPartA() {
return partA;
}
public String getPartB() {
return partB;
}
}
interface Builder{
void buildPartA();
void buildPartB();
Product getResult();
}
class ConcreateBuilder1 implements Builder{
private Product product;
public ConcreateBuilder1(){
product = new Product();
}
@Override
public void buildPartA() {
product.setPartA("component A1");
}
@Override
public void buildPartB() {
product.setPartB("component B1");
}
@Override
public Product getResult() {
System.out.println(product.getPartA()+"||"+product.getPartB());
return product;
}
}
class ConcreateBuilder2 implements Builder{
private Product product;
public ConcreateBuilder2(){
product = new Product();
}
@Override
public void buildPartA() {
product.setPartA("component A2");
}
@Override
public void buildPartB() {
product.setPartB("component B2");
}
@Override
public Product getResult() {
System.out.println(product.getPartA()+"||"+product.getPartB());
return product;
}
}
class Director{
private Builder builder;
public Director (Builder builder){
this.builder = builder;
}
public void construct(){
builder.buildPartA();
builder.buildPartB();
Product product = builder.getResult();
}
}
运行结果: