第六章 建造者模式

news2024/11/23 19:54:18

文章目录

  • 前言
  • 一、传统方式解决盖房子需求
    • 完整代码
    • 抽象房子类 AbstractHouse
    • 实现子类 普通房子
    • 实现子类 高楼大厦
    • 客户端盖房子
  • 二、引入建造者模式
    • 建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者
    • 完整代码
    • House类 (产品角色)
    • 抽象父类(抽象建造者) HouseBuilder
    • 子类(具体建造者)CommonHouse / HighBuilding
    • 指挥者 HouseDirector
    • 客户端 Client
  • 三、JDK中的建造者模式 StringBuilder
  • 四、建造者模式的注意事项和细节


前言

在这里插入图片描述


一、传统方式解决盖房子需求

在这里插入图片描述

完整代码

抽象房子类 AbstractHouse

package tanchishell.SJMS.builder;

public abstract class AbstractHouse {

    //打地基
    public abstract void buildBasic();
    //砌墙
    public abstract void buildWalls();
    //封顶
    public abstract void roofed();

    //建房子
    public void build() {
        buildBasic();
        buildWalls();
        roofed();
    }
}

实现子类 普通房子

package tanchishell.SJMS.builder;

public class CommonHouse extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println(" 普通房子开始打地基 ");
    }

    @Override
    public void buildWalls() {
        System.out.println(" 普通房子砌墙 10 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println(" 普通房子盖普通屋顶  ");
    }
}


实现子类 高楼大厦

package tanchishell.SJMS.builder;

public class HighBuilding extends AbstractHouse {

    @Override
    public void buildBasic() {
        System.out.println("  高楼大厦打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  高楼大厦砌墙 20  cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  高楼大厦的透明屋顶  ");
    }
}

客户端盖房子

package tanchishell.SJMS.builder;

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        commonHouse.build();

        /** 输出
         *  普通房子开始打地基
         *  普通房子砌墙 10 cm
         *  普通房子盖普通屋顶
         */
    }
}

在这里插入图片描述

二、引入建造者模式

在这里插入图片描述

建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

House类 (产品角色)

package tanchishell.SJMS.builder2;

//产品->Product
public class House {
    private String baise;
    private String wall;
    private String roofed;

    public String getBaise() {
        return baise;
    }

    public void setBaise(String baise) {
        this.baise = baise;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoofed() {
        return roofed;
    }

    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }
}

抽象父类(抽象建造者) HouseBuilder

package tanchishell.SJMS.builder2;

// 抽象的建造者
public abstract class HouseBuilder {

    //组合房子,同生共死
    House house = new House();

    //打地基
    public abstract void buildBasic();
    //砌墙
    public abstract void buildWalls();
    //封顶
    public abstract void roofed();

    //建房子
    public House buildHouse() {
        return house;
    }

//    //更换房子的创建规模 该场景暂不支持
//    public House UpdateHouse(House house2){
//        house = house2;
//
//        return house;
//    }
}

子类(具体建造者)CommonHouse / HighBuilding

package tanchishell.SJMS.builder2;

public class CommonHouse extends HouseBuilder{
    @Override
    public void buildBasic() {
        System.out.println("  普通房子打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  普通房子砌墙 10 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  普通房子的普通屋顶  ");
    }
}

package tanchishell.SJMS.builder2;

public class HighBuilding extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("  高楼大厦打地基  ");
    }

    @Override
    public void buildWalls() {
        System.out.println("  高楼大厦打砌墙 20 cm  ");
    }

    @Override
    public void roofed() {
        System.out.println("  高楼大厦的透明屋顶  ");
    }
}


指挥者 HouseDirector

package tanchishell.SJMS.builder2;

public class HouseDirector {

    //组合 抽象建造者
    HouseBuilder houseBuilder = null;

    //构造器传入 houseBuilder
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //通过 setter 传入 houseBuilder
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    //如何处理建造房子的流程,交给指挥者
    public House constructHouse() {
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}

客户端 Client

package tanchishell.SJMS.builder2;

public class Client {
    public static void main(String[] args) {
        HouseDirector houseDirector = new HouseDirector(new CommonHouse());
        //返回产品 普通房子
        House house = houseDirector.constructHouse();



        System.out.println("-----------------指挥者更换产品  -----------------");
        //指挥者更换产品
        houseDirector.setHouseBuilder(new HighBuilding());
        //返回产品 高楼大厦
        House house1 = houseDirector.constructHouse();


    }
}

三、JDK中的建造者模式 StringBuilder

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、建造者模式的注意事项和细节

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node内置模块 【Event事件模块】

文章目录 🌟前言🌟Event事件模块🌟EventEmitter类🌟加载events模块🌟实例化eventEmitter对象 🌟事件方法列表🌟使用事件🌟异步与同步 🌟写在最后 🌟前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…

CE作业(3)

1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息&…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》,已经对证书这些概念有基本的了解&#xff…

Docker容器---dockerfile简介

Docker容器---dockerfile简介 一、dockerfile概念1、dockerfile介绍2、基于dockerfile创建3、docker镜像加载原理 二、镜像的创建1、基于现有镜像创建2、基于本地模板创建3、基于dockerfile创建 三、Dockerfile编写1、dockerfile操作指令(1)FROM 镜像&am…

9. 自注意力机制(Self-attention Part2)

P27 自注意力机制(Self-attention Part2) 视频链接 P27 自注意力机制(Self-attention Part2) 计算流程: Multi-head: 应用:

数据结构入门篇:第一篇

数据结构入门篇:第一篇 时间复杂度 数据结构入门篇:第一篇1.时间复杂度2.时间复杂度的练习总结 🤔首先,为什么要学数据结构? 数据结构的概念:在内存中对数据进行管理; 数据结构的学习能让我们在…

C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图

最终效果: V1.8.2 20230419 文字生成单色BMP图片4.exe 默认1280*720 如果显示不全,请把宽和高加大 字体加大。 首先,用windows画板生成一张1*1白色单色图作为标准,数据如下: 数据解析参考:BMP图像文件完…

【K8S系列】深入解析StatefulSet(二)

序言 那些看似不起波澜的日复一日,一定会在某一天让你看见坚持的意义。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤: 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的,拟合方程是2阶的数据是4阶的,拟合方程也是4阶…

3年自动化测试(心路历程),从月薪10k到30k我经历了什么?

前言 2018年的时候,由于项目的原因,开始使用Robot Framework测试框架,正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理,并可以根据项目的需要开发系统关键字。2019年随着移动App越来越流行,乘着换…

HTML5超链接和图片基础用法

一、HTML5 超链接(链接) 超链接可以是一个文本,也可以是一幅图像,您可以点击这些内容来跳转到新的页面或新的文档或者当前文档中的某个部分。 当您把鼠标指针移动到网页中的某个链接上时,箭头会变为一只小手。 1.我…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多?很多python\R语言绘图包都会带着好几套配色方案,比如很常见的ggsci绘图包就自带45套离散配色,于是本工具收集了常见55个绘图包中的离散配色,制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…

CleanMyMac4.13最新免费mac电脑系统优化软件

CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具,电脑刚装完系统的时候运行速度超级快,随着时间的推移,你会发现越来越慢,经常会反应卡顿,越来越多的垃圾文件占用了你的磁盘空间,各种过时的日志&am…

数组题目总结 -- 前缀和数组

目录 一. 区域和检索 - 数组不可变1. 思路和代码I. 博主的做法:II. 东哥的做法: 2. 总结 二. 二维区域和检索 - 矩阵不可变1. 思路和代码I. 博主的做法:II. 东哥的做法: 2. 总结 一. 区域和检索 - 数组不可变 题目链接&#xff1…

【方法一:二分+字符串哈希 优化】【dp——取不取问题-背包】最长公共子串【上海交通大学考研机试题】

最长公共子串 二分方法字符串哈希的复习字符串哈希 如何理解 二分代码 dp方法字符串str1中以第i个字符为结尾的子串 与字符串str2中以第i个字符为结尾的子串的连续公共子串 二维一维优化 二分方法 由于这个题是要求求子串,而子串是连续的一段,所以用二分…

在微信小程序中怎么使用vant框架?

目录标题 首先介绍什么是vant一、第一步,打开我们小程序项目目录,找到所在的位置,打开终端二、对项目进行初始化三、进行安装依赖1、通过npm安装vant/weapp2、安装miniprogram 四、修改app.json五、修改project.config.json六、然后构建npm 需…

使用Word的一些技巧记录

本文主要用于记录书写毕业论文时,遇到的Word的使用技巧。 设置样式及多级列表 每个学校必然会对论文中的字体、字号、行间距提出要求,设置Word中样式解决此问题。 例如,本校的格式要求为: 正文中的一级标题(章目&a…

【C#】GridControl动态更换DataSource,查询数据异常处理

系列文章 【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…