什么是生成器模式?一文详解

目录

一.意图

二.结构

三.举例:产品套餐

1.代码实现

①创建"产品"

②创建"抽象套餐"

③创建"具体套餐1"

④创建"具体套餐2"

⑤创建"服务员"

最终,进行测试

四.真题

1.2017年上半年

题目

分析过程

正确答案

2.2018年上半年

题目

分析过程

正确答案


一.意图

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

二.结构

三.举例:产品套餐

1.代码实现

①创建"产品"

java 复制代码
//产品
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");
    }
}

②创建"抽象套餐"

java 复制代码
//抽象套餐
public abstract class Builder {
    public abstract void BuildPart();
    public abstract Product getResult();
}

③创建"具体套餐1"

java 复制代码
//具体套餐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"

java 复制代码
//具体套餐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;
    }
}

⑤创建"服务员"

java 复制代码
//服务员
public class Director {
    //这是关键:这里接收的参数是"抽象套餐Builder",将来要传入"具体套餐Builder1" or "具体套餐Builder2"
    public void Construct(Builder builder){
        builder.BuildPart();
    }
}

最终,进行测试

java 复制代码
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()

正确答案

将我们上述的答案和正确答案对比,发现全对了。

相关推荐
怕浪猫1 小时前
面试官让我手写一个 Tool Use,我用了 3 种方案
设计模式·面试·程序员
geovindu17 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Hill Climbing Loop(2026 最新版)
人工智能·python·设计模式
晚安code2 天前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11102 天前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至3 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.3 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
沫璃染墨3 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
c萱4 天前
AI产品经理——01基础认知篇
设计模式·prompt·aigc·产品经理·ai编程·gitcode·ai-native