千家信息网

创建型模式:建造者模式

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,文章首发:创建型模式:建造者模式五大创建型模式之四:建造者模式。简介姓名 :建造者模式英文名 :Builder Pattern价值观 :专治丢三落四个人介绍 :Separate the constru
千家信息网最后更新 2025年01月25日创建型模式:建造者模式

文章首发:
创建型模式:建造者模式

五大创建型模式之四:建造者模式。

简介

姓名 :建造者模式

英文名 :Builder Pattern

价值观 :专治丢三落四

个人介绍

Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
(来自《设计模式之禅》)

今天给大家介绍的是建造者模式。建造者模式的使用场景是:创建复杂的对象。什么才能算复杂对象?如果一个对象只需要通过 new XXX() 的方式创建,那就算是一个简单对象;如果需要 new XXX(),并且还要设置很多属性,那这种就可以称为复杂对象了,因为它的构建过程比较复杂。采用建造者模式,可以把这个复杂的构建过程抽离开,使它不依赖创建者。下面我们通过故事来讲解。

你要的故事

还记得小时候刚开始学煮汤,不了解怎么煮,第一次是煮了板栗排骨汤,因为板栗比较难熟,所以是跟排骨一起下锅,然后煮了 40 分钟,加了盐就可以出锅啦。第二次煮了冬瓜排骨汤,不懂得冬瓜容易熟,就和排骨一起下锅,煮了也差不多 40 分钟,下了盐和香菜,发现怎么这汤有点浓,冬瓜咋都不见了(全都煮透了),我妈看到这锅汤,才跟我说冬瓜容易熟,得先熬排骨,再放冬瓜进去煮。那时才发现熬汤特么还有这差异。

上面是背景哈,接下来我们来实现这个煲汤过程,冬瓜排骨汤是先加排骨,熬制 30 分钟,加冬瓜,熬制 18 分钟,加盐加香菜;板栗排骨汤是先加排骨和板栗,熬制 40 分钟,再加盐。这汤都需要加肉、加菜、熬制、加配料。我们使用下面代码实现这个煲冬瓜排骨汤和板栗排骨汤的过程。

public class NoBuilderTest {    public static void main(String[] args) {        // 熬制冬瓜排骨汤        DongGuaPaiGuSoup dongGuaPaiGuSoup = new DongGuaPaiGuSoup();        // 加排骨        dongGuaPaiGuSoup.addMeat();        // 熬制 30 分钟        dongGuaPaiGuSoup.waitMinute(30);        // 加冬瓜        dongGuaPaiGuSoup.addVegetables();        // 熬制 10 分钟        dongGuaPaiGuSoup.waitMinute(10);        // 加盐加香菜        dongGuaPaiGuSoup.addIngredients();        // 熬制板栗排骨汤        BanLiPaiGuSoup banLiPaiGuSoup = new BanLiPaiGuSoup();        // 加排骨        banLiPaiGuSoup.addMeat();        // 加板栗        banLiPaiGuSoup.addVegetables();        // 熬制 40 分钟        banLiPaiGuSoup.waitMinute(40);        // 加盐        banLiPaiGuSoup.addIngredients();    }}/** * 煲汤接口 */interface Soup {    /** 加肉 */    void addMeat();    /** 加菜 */    void addVegetables();    /** 熬制 */    void waitMinute(int minute);    /** 加配料 */    void addIngredients();}/** * 冬瓜排骨汤 */class DongGuaPaiGuSoup implements Soup {    @Override    public void addMeat() {        System.out.println("加排骨");    }    @Override    public void addVegetables() {        System.out.println("加冬瓜");    }    @Override    public void waitMinute(int minute) {        System.out.println("熬制 " + minute + " 分钟");    }    @Override    public void addIngredients() {        System.out.println("加盐、加香菜");    }}/** * 板栗排骨汤 */class BanLiPaiGuSoup implements Soup {    @Override    public void addMeat() {        System.out.println("加排骨");    }    @Override    public void addVegetables() {        System.out.println("加板栗");    }    @Override    public void waitMinute(int minute) {        System.out.println("熬制 " + minute + " 分钟");    }    @Override    public void addIngredients() {        System.out.println("加盐");    }}

上面代码简单实现了煲冬瓜排骨汤和板栗排骨汤。煲汤我们要关注的点是:各操作的顺序,是先加肉先煮再加菜,还是肉和菜一起放进锅煮。上面代码中,这个过程是谁控制的?是煲汤的人,所以顺序由煲汤的人决定,甚至有可能忘记放配料啥的,这样子的汤就味道不够好。那怎么去解决这些问题?

我们通过建造者模式可以解决上面的 2 个问题:煲汤顺序问题和忘记加配料这种丢三落四行为。我们将这个煲汤顺序从煲汤者分离开来,让煲汤者只需要决定煲什么汤就好,让建造者来保证煲汤顺序问题和防止漏加配料。

我们用一个 SoupBuilder 来规范化煲汤过程,方法 buildSoup 给实现者提供一个设置煲汤顺序的地方。因为冬瓜排骨汤和板栗排骨汤熬制的过程不一样,所以分别用 DongGuaPaiGuSoupBuilder 和 BanLiPaiGuSoupBuilder 来具体实现冬瓜排骨汤和板栗排骨汤的熬制过程,也就是消除熬制过程和煲汤者的依赖关系。 Director 则相当于一个菜单,提供为熬汤者来选择熬什么汤。具体代码如下所示。

public class BuilderTest {    public static void main(String[] args) {        Director director = new Director();        // 熬制冬瓜排骨汤        director.buildDongGuaPaiGuSoup();        // 熬制板栗排骨汤        director.buildBanLiPaiGuSoup();    }}/** * 煲汤建造接口 */interface SoupBuilder {    void buildSoup();    Soup getSoup();}/** * 冬瓜排骨汤建造者 */class DongGuaPaiGuSoupBuilder implements SoupBuilder {    private DongGuaPaiGuSoup dongGuaPaiGuSoup = new DongGuaPaiGuSoup();    @Override    public void buildSoup() {        // 加排骨        dongGuaPaiGuSoup.addMeat();        // 熬制 30 分钟        dongGuaPaiGuSoup.waitMinute(30);        // 加冬瓜        dongGuaPaiGuSoup.addVegetables();        // 熬制 10 分钟        dongGuaPaiGuSoup.waitMinute(10);        // 加盐加香菜        dongGuaPaiGuSoup.addIngredients();    }    @Override    public Soup getSoup() {        return dongGuaPaiGuSoup;    }}/** * 板栗排骨汤建造者 */class BanLiPaiGuSoupBuilder implements SoupBuilder {    BanLiPaiGuSoup banLiPaiGuSoup = new BanLiPaiGuSoup();    @Override    public void buildSoup() {        // 加排骨        banLiPaiGuSoup.addMeat();        // 加板栗        banLiPaiGuSoup.addVegetables();        // 熬制 40 分钟        banLiPaiGuSoup.waitMinute(40);        // 加盐        banLiPaiGuSoup.addIngredients();    }    @Override    public Soup getSoup() {        return banLiPaiGuSoup;    }}/** * 生产方 */class Director {    private DongGuaPaiGuSoupBuilder dongGuaPaiGuSoupBuilder = new DongGuaPaiGuSoupBuilder();    private BanLiPaiGuSoupBuilder banLiPaiGuSoupBuilder = new BanLiPaiGuSoupBuilder();    /**     * 熬制冬瓜排骨汤     */    public DongGuaPaiGuSoup buildDongGuaPaiGuSoup() {        dongGuaPaiGuSoupBuilder.buildSoup();        return (DongGuaPaiGuSoup) dongGuaPaiGuSoupBuilder.getSoup();    }    /**     * 熬制板栗排骨汤     */    public BanLiPaiGuSoup buildBanLiPaiGuSoup() {        banLiPaiGuSoupBuilder.buildSoup();        return (BanLiPaiGuSoup) banLiPaiGuSoupBuilder.getSoup();    }}

通过用建造者实现,是不是保证了熬制汤的顺序并且一定会加够料?感受一下其中的奥秘吧。

代码:
Builder Pattern

总结

通过建造者模式,可以把本来强依赖的东西解绑,不仅仅解决依赖问题,还提高了封装性,让使用者不用明白内部的细节,用上面的例子说就熬汤不用关心怎么熬制的过程,就像我们想喝冬瓜排骨汤,告诉妈妈,妈妈熬制,我们并不知道是怎么熬制的。

推荐阅读

单一职责原则(方法:修改名字还是密码?接口:洗碗、买菜还是倒垃圾?类:注册、登录和注销)
里氏替换原则(我儿来自新东方烹饪)
依赖倒置原则(抠门的饭店老板)
接口隔离原则(小伙子的作坊)
迪米特法则(手机上看电子书)
开闭原则(社保这点事)
创建型模式:单例模式(小明就只有 1 辆车)
创建型模式:工厂方法(小明家的车库)
创建型模式:抽象工厂(宝马车就得用宝马轮胎和宝马方向盘)

设计模式文章会持续更新,欢迎关注公众号,第一时间获取文章推送。

公众号后台回复『大礼包』获取 Java、Python、IOS 等教程
加个人微信备注『教程』获取架构师、机器学习等教程

排骨 排骨汤 冬瓜 模式 板栗 过程 顺序 复杂 对象 代码 原则 配料 问题 香菜 接口 教程 文章 方法 还是 宝马 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 宝塔数据库怎么删除数据 数据库查询和表有什么区别 视易锋云服务器系统管理软件 新软件开发票添加商品怎么加 dsp 集成软件开发环境 包河区企业网络技术服务哪家好 计算器网络技术专业学什么 计算机网络技术专业毕业 移动软件开发干嘛的 herom2引擎数据库教程 天行加速器无法获取服务器地址 医院网络安全整改规划 小霸王服务器dnf op数据库是什么意思 丹江口智能软件开发诚信为本 中国网络安全上市时间 河南省网络安全测评 徽商期货为什么连接服务器超时 关注网络安全 建设活动 服务器长时间运行cpu 网络安全云计算公式 长沙java软件开发教程 linux数据库怎么改编码 局域网云服务器搭建 考试服务器由谁统一负责管理 小手拉大手网络安全主题手抄报 宜兴定制软件开发价格 英特尔服务器cpu天梯图 半仙小说软件开发 北京环境监测软件开发价位
0