目录
一.意图
二.结构
三.举例:产品套餐
1.代码实现
①创建“产品”
②创建“抽象套餐”
③创建“具体套餐1”
④创建“具体套餐2”
⑤创建“服务员”
最终,进行测试
四.真题
1.2017年上半年
题目
分析过程
正确答案
2.2018年上半年
题目
分析过程
正确答案
一.意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二.结构
三.举例:产品套餐
1.代码实现
①创建“产品”
//产品 public class Product { //组成产品的部件(材料) List<String> parts = new ArrayList<>(); public void add(String part){ parts.add(part); } public void show(){ System.out.println("产品的组成:"); for(String s : parts){ System.out.print(s + ""); } System.out.println("\n"); } }②创建“抽象套餐”
//抽象套餐 public abstract class Builder { public abstract void BuildPart(); public abstract Product getResult(); }③创建“具体套餐1”
//具体套餐1 public class Builder1 extends Builder{ //这很关键,要将产品放到具体套餐中,从而构造产品内容 Product product = new Product(); @Override public void BuildPart() { product.add("A"); product.add("B"); product.add("C"); product.add("D"); } @Override public Product getResult() { return product; } }④创建“具体套餐2”
//具体套餐2 public class Builder2 extends Builder{ //这很关键,要将产品放到具体套餐中,从而构造产品内容 Product product = new Product(); @Override public void BuildPart() { product.add("E"); product.add("F"); product.add("G"); } @Override public Product getResult() { return product; } }⑤创建“服务员”
//服务员 public class Director { //这是关键:这里接收的参数是“抽象套餐Builder”,将来要传入"具体套餐Builder1" or "具体套餐Builder2" public void Construct(Builder builder){ builder.BuildPart(); } }最终,进行测试
public class Demo01Application { public static void main(String[] args) { //1.创建服务员 Director director = new Director(); //2.创建具体套餐1 Builder builder1 = new Builder1(); //3.服务员通知后厨做具体套餐1 director.Construct(builder1); //4.查看具体套餐1的内容 Product product1 = builder1.getResult(); product1.show(); //创建具体套餐2 Builder builder2 = new Builder2(); //服务员通知后厨做具体套餐2 director.Construct(builder2); //查看具体套餐2的内容 Product product2 = builder2.getResult(); product2.show(); } }运行效果如下:
四.真题
1.2017年上半年
题目
分析过程
(1)abstract void buildParts()
由于PizzaBuilder是抽象类,且第一空的方法没有方法体,所以肯定是一个抽象方法,因此要用abstract关键字修饰;再根据子类的具体实现,发现返回值为void、方法名叫buildParts,形参列表为空。
故第一空的答案是:abstract void buildParts()
(2)this.pizzaBuilder = pizzaBuilder
故答案为:this.pizzaBuilder = pizzaBuilder
(3)pizzaBuilder.buildParts()
故答案为:pizzaBuilder.buildParts()
(4)waiter.setPizzaBuilder(hawaiian_pizzabuilder)
故答案为:waiter.setPizzaBuilder(hawaiian_pizzabuilder)
(5)waiter.construct()
故答案为:waiter.construct()
正确答案
经过对比,发现我们上述的答案全对了。
2.2018年上半年
题目
分析过程
(1)(2)
根据Builder接口的实现类,可以找出缺少的两个方法,故:
- 第一空的答案:void buildPartA()
- 第二空的答案:Product getResult()
(3)(4)
由于第三空和第四空,根据方法名可以知道,是在给product类的partA和partB两个属性赋值,所以要调用Product类的setPartA和setPartB,故:
- 第三空的答案是:product.setPartA
- 第四空的答案是:product.setPartB
(5)builder.builderPartA()或者builder.builderPartB()
故第五空的答案为:builder.builderPartA()或者builder.builderPartB()
正确答案
将我们上述的答案和正确答案对比,发现全对了。