百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

设计模式之-生成器_一键生成设计

liuian 2025-10-02 03:20 28 浏览



一、【概念定义】—— “分步构建复杂对象,隐藏创建细节”

生成器模式(Builder Pattern)
一种“分步构建型”创建型设计模式,它
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
核心思想:
用“生成器”逐步设置对象属性,最后调用 build() 方法一次性返回完整对象
目标:
解决构造函数参数爆炸、对象创建过程复杂、需要创建不同表示的问题

口诀:“复杂对象不好造,生成器来分步搞;隐藏细节控流程,不同表示它都包!”


二、【解决的问题】—— “手搓复杂对象”的三大灾难

想象你正在开发一个电脑配置系统

  • 超长构造函数:
    Computer(String cpu, String ram, String gpu, String storage, String psu, String cooler...)
    → 参数太多!顺序难记!可选参数怎么办?→
    重载地狱!
  • Setter 方法:
    computer.setCPU("i9"); computer.setRAM("32GB"); ...
    → 对象可能被部分初始化就使用!→
    不一致状态!
  • 生成器模式:
    • ComputerBuilder 提供链式方法:builder.setCPU().setRAM().setGPU()...;
    • build() 方法校验完整性并返回 Computer;
      创建过程清晰、对象完整、支持不同配置!

核心解决:

构造函数参数爆炸 → 分步设置属性;对象不完整风险 → build() 方法统一校验;创建不同表示困难 → 同一流程创建不同配置(游戏本/办公本)。


三、【适用场景】—— “复杂对象构建”的四大名器

你该用生成器模式,如果符合以下“四复原则”:

场景

描述

举例

对象构造参数多

构造函数参数 > 4 个,或含可选参数

电脑配置、HTTP请求、SQL查询构建器

对象创建过程复杂

初始化需多步、有依赖或校验逻辑

汽车组装、房屋建造、复杂文档生成

需要创建不同表示

同一流程创建不同配置/风格的对象

游戏角色(战士/法师)、报表(PDF/HTML)、套餐(经济/豪华)

隐藏创建细节

客户端不关心对象内部结构

框架API(如OkHttp Request.Builder)、DSL(领域特定语言)

警告:如果对象简单(如 User(name, age)) —— 生成器是过度设计!


四、【经典案例】—— 四大“装配流水线王者”的成名战

1. 【电脑配置系统】—— 游戏本、办公本、设计本,一套流水线!

需要组装不同配置的电脑:游戏本(高显卡)、办公本(大内存)、设计本(高色域屏)
多个构造函数:ComputerGame(), ComputerOffice(), ComputerDesign() → 代码重复!
生成器模式:

ComputerBuilder.setCPU().setGPU().setRAM()...;buildGamingPC() → 预设 i9+RTX4090;buildOfficePC() → 预设 i5+大内存;
效果:新增“服务器配置”?只需 buildServerPC()!
客户端代码无需修改!

2. 【手机套餐定制】—— 通话、流量、增值服务,自由组合!

套餐包含:基础通话、流量包、增值服务(视频会员、云存储)
Setter 方法:可能忘记设置流量 → 套餐无效!
生成器模式:

PackageBuilder.setMinutes().setData().addService();build() 校验:必须设置通话和流量!
效果:新增“5G套餐”?只需调整 setData("100GB 5G")!
套餐完整性有保障!

3. 【房屋建造系统】—— 别墅、公寓、LOFT,结构不同!

房屋包含:地基、墙体、屋顶、门窗、装修风格
直接构造:参数太多!且“屋顶”依赖“墙体”完成!
生成器模式:


HouseBuilder.buildFoundation().buildWalls().buildRoof()...;buildVilla() → 花园+泳池;buildApartment() → 简约装修;

效果:新增“智能房屋”?只需 addSmartSystem()!
建造步骤可控制顺序!

4. 【SQL查询构建器】—— SELECT、WHERE、ORDER BY,链式操作!

动态构建SQL:SELECT name FROM users WHERE age>18 ORDER BY name
字符串拼接:"SELECT " + columns + " FROM " + table + " WHERE " + condition... → 易出错!
生成器模式(如 MyBatis Dynamic SQL):

sqlBuilder.select("name").from("users").where("age>18").orderBy("name");build() 生成完整SQL并校验语法;
效果:新增“GROUP BY”?只需 groupBy() 方法!
SQL构建安全又优雅!


五、【结构简述】—— 生成器宇宙的“四步装配法”

生成器模式四要素:

角色

职责

比喻

Product(产品)

被构建的复杂对象

“电脑主机” —— 最终交付的产品

Builder(生成器接口)

声明构建各部件的方法和获取产品的 build() 方法

“装配流水线协议” —— 定义 setCPU(), setRAM(), build()

ConcreteBuilder(具体生成器)

实现 Builder 接口,构建并组装部件,提供 build() 返回产品

“游戏本流水线”、“办公本流水线” —— 具体装配工

Director(指挥者,可选)

使用 Builder 接口,指导构建过程(定义步骤顺序)

“装配主管” —— 决定先装CPU还是先装内存

调用流程(无Director):
Client → 创建 ConcreteBuilder → 调用 builder.setPartA().setPartB()... → builder.build() → 返回 Product
调用流程(有Director):
Client → 创建 ConcreteBuilder + Director → director.construct(builder) → builder.build() → 返回 Product


六、【注意事项】—— “流水线”虽强,小心“过度设计”!

1. Director 是否必要?

Director 封装构建顺序 → 但常被客户端直接调用 Builder 替代!
建议:

简单场景 → 客户端直接调用 Builder(更灵活);复杂固定流程 → 用 Director(如房屋建造步骤)。

2. Builder 与 Factory 的混淆

工厂方法创建不同类型的对象(如 iOSButton / AndroidButton);生成器分步创建同一类型的不同表示(如 高配电脑 / 低配电脑);
记住:工厂是“选类型”,生成器是“配参数”。

3. 性能开销

多一层 Builder 对象 → 轻微内存和调用开销(通常可忽略)
权衡:对象复杂度 > 性能损耗 时使用。

4. 现代语言的简化

Java 14+ Records、Lombok @Builder、Kotlin apply{} 可简化代码!
但理解模式本质更重要 ——
分步构建、隐藏细节、保证完整


七、【实战应用】—— 45行代码,打造“电脑生成器系统”

java

深色版本

// 1. 产品:电脑
class Computer {
    private String cpu;
    private String ram;
    private String gpu;
    private String storage;
    private String psu; // 电源

    // 私有构造函数,强制通过 Builder 创建
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.gpu = builder.gpu;
        this.storage = builder.storage;
        this.psu = builder.psu;
        validate(); // 构建时校验完整性
    }

    private void validate() {
        if (cpu == null || ram == null || storage == null) {
            throw new IllegalStateException(" 电脑必须包含CPU、内存和存储!");
        }
    }

    @Override
    public String toString() {
        return " 电脑配置:\n" +
               "   CPU: " + cpu + "\n" +
               "   内存: " + ram + "\n" +
               "   显卡: " + (gpu != null ? gpu : "集成显卡") + "\n" +
               "   存储: " + storage + "\n" +
               "   电源: " + psu;
    }

    // 2. 生成器:静态内部类(经典实现)
    public static class Builder {
        private String cpu;
        private String ram;
        private String gpu;
        private String storage;
        private String psu = "500W"; // 默认电源

        public Builder setCpu(String cpu) {
            this.cpu = cpu;
            return this; // 链式调用
        }

        public Builder setRam(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder setGpu(String gpu) {
            this.gpu = gpu;
            return this;
        }

        public Builder setStorage(String storage) {
            this.storage = storage;
            return this;
        }

        public Builder setPsu(String psu) {
            this.psu = psu;
            return this;
        }

        // 构建方法:返回完整产品
        public Computer build() {
            return new Computer(this); // 调用私有构造函数
        }
    }
}

// 3. (可选)指挥者:预设配置
class ComputerDirector {
    // 构建游戏电脑
    public Computer buildGamingComputer() {
        return new Computer.Builder()
                .setCpu("Intel i9-13900K")
                .setRam("32GB DDR5")
                .setGpu("NVIDIA RTX 4090")
                .setStorage("2TB NVMe SSD")
                .setPsu("1000W 金牌")
                .build();
    }

    // 构建办公电脑
    public Computer buildOfficeComputer() {
        return new Computer.Builder()
                .setCpu("Intel i5-13400")
                .setRam("16GB DDR4")
                .setStorage("512GB SSD") // 无独立显卡
                .build(); // 使用默认电源
    }
}

// 4. 客户端
public class BuilderDemo {
    public static void main(String[] args) {
        System.out.println(" 电脑装配流水线启动...");

        // 方式1:客户端直接使用 Builder(灵活定制)
        Computer customPC = new Computer.Builder()
                .setCpu("AMD Ryzen 7")
                .setRam("64GB DDR5")
                .setGpu("NVIDIA RTX 4080")
                .setStorage("4TB SSD")
                .setPsu("850W")
                .build();

        System.out.println(" 定制电脑:");
        System.out.println(customPC);

        // 方式2:通过 Director 获取预设配置(标准化)
        ComputerDirector director = new ComputerDirector();
        Computer gamingPC = director.buildGamingComputer();
        Computer officePC = director.buildOfficeComputer();

        System.out.println("\n 游戏电脑:");
        System.out.println(gamingPC);

        System.out.println("\n 办公电脑:");
        System.out.println(officePC);

        // 新增“设计本”?只需在 Director 中添加 buildDesignComputer()!
        // 或客户端自由组合!产品类无需修改!
    }
}

运行结果:

深色版本
 电脑装配流水线启动...
 定制电脑:
 电脑配置:
   CPU: AMD Ryzen 7
   内存: 64GB DDR5
   显卡: NVIDIA RTX 4080
   存储: 4TB SSD
   电源: 850W

 游戏电脑:
 电脑配置:
   CPU: Intel i9-13900K
   内存: 32GB DDR5
   显卡: NVIDIA RTX 4090
   存储: 2TB NVMe SSD
   电源: 1000W 金牌

 办公电脑:
 电脑配置:
   CPU: Intel i5-13400
   内存: 16GB DDR4
   显卡: 集成显卡
   存储: 512GB SSD
   电源: 500W

看到了吗?客户端可以自由组合配置,或使用预设方案!

build() 方法确保电脑必有 CPU、内存、存储!链式调用 setXXX().setYYY() 让代码清晰流畅!
新增“服务器配置”?只需:

public Computer buildServerComputer() { return new Computer.Builder() .setCpu("Dual Xeon") .setRam("128GB ECC") .setStorage("10TB RAID") .setPsu("冗余电源") .build(); }

—— 产品类和客户端代码无需修改!这就是生成器模式的力量!


最后总结:生成器模式 —— 对象界的“精密装配大师”

以前:构造函数爆炸 → 参数难记,对象易残;
现在:生成器流水线 → 分步装配,完整交付!
生成器模式就是对象界的“乐高大师” ——
把复杂对象拆解为步骤,用清晰的接口组装,让创建过程可控、安全、优雅!


记忆口诀:

复杂对象不好搞,
生成器来分步造。
链式调用真流畅,
最终交付完整性保!
电脑套餐房屋建,
不同配置它都包。
指挥预设或自选,
扩展新品不用恼!
莫为简单对象忙,
参数爆炸再登场!

相关推荐

搭建一个20人的办公网络(适用于20多人的小型办公网络环境)

楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...

笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)

1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...

汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)

使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...

xpsp3安装版系统下载(windowsxpsp3安装教程)

xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...

没有备份的手机数据怎么恢复

手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。  2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。  3、...

电脑怎么激活windows11专业版

win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...

华为手机助手下载官网(华为手机助手app下载专区)

华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...

光纤线断了怎么接(宽带光纤线断了怎么接)

宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...

深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
win7旗舰版和专业版区别(win7旗舰版跟专业版)

1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...

万能连接钥匙(万能wifi连接钥匙下载)

1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...

雨林木风音乐叫什么(雨林木风是啥)

雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...

aics6序列号永久序列号(aics6破解序列号)

关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...

win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)

答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...