第七章 建造者模式

news2024/11/19 5:53:50

文章目录

  • 前言
  • 一、传统方式解决盖房子需求
    • 完整代码
    • 抽象房子类 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/451314.html

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

相关文章

CV 领域的 ChatGPT?MetaAI 推出“最强”大视觉模型 SAM

出品人:Towhee 技术团队 随着 ChatGPT 引起一波又一波的“GPT热潮”,自然语言领域又一次成为了人工智能的讨论焦点。大家不由得思考,计算机视觉领域里是否会出现这样一个堪称划时代的模型?在这种万众瞩目的时候,一直处…

Python3《机器学习实战》学习笔记(七):支持向量机原理篇之手撕线性SVM

文章目录 一、SVM介绍二、线性SVM2.1 数学建模2.1.1决策面方程2.1.2"分类间隔"方程2.1.3约束条件2.1.4线性SVM优化问题基本描述2.1.5求解准备(讲讲凸函数)2.1.6拉格朗日函数2.1.7KKT条件2.1.8对偶问题求解2.1.9最后求解 2.2 SMO算法 三、代码实战3.1准备数据 一、SVM…

M_Map工具箱简介及地理图形绘制

M_Map工具箱简介及地理图形绘制 1 M_Map简介1.1 具体代码说明 2 地理图形绘制案例2.1 M_Map给定案例2.1.1 M_Map Logo2.1.2 Lambert Conformal Conic projection of North American Topography2.1.3 Stereographic projection of North Polar regions2.1.4 Colourmaps 2.2 案例…

vue封装公共组件库并发布到npm库详细教程

vue组件封装的原理:利用vue框架提供的api: Vue.use( plugin ),我们需要把封装好组件的项目打包成vue库,并提供install方法,然后发布到npm中。Vue.use( plugin )的时候会自动执行插件中的install方法。 一、组件库代码目录 目录…

常见的四种排名函数的用法(sql)

四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER(排名场景推荐) 1.1 介绍 在 SQL 中,ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配一个唯一的序号。该函数的语法如下: …

内网渗透之横向移动PTHPTTPTK

0x00前言 pass the hash(哈希传递攻击,简称pth) pass the ticket(票据传递攻击,简称ptt) pass the key(密钥传递攻击,简称ptk) PTH(pass the hash) #利用的lm或ntlm的值…

【社区图书馆】 Go佬—Go程序开发实战宝典书评

文章目录 前言内容介绍文章大致划分总结 前言 《Go 程序开发实战宝典》是一本非常实用的 Go 语言开发工具书,本书由深入浅出的案例讲解、详细的技术实现、贴近实际的应用开发等组成,非常适合 Go 语言开发爱好者、从事相关行业的工程师、技术负责人以及深…

ThinkPHP视图

ThinkPHP视图 前言视图一、运算符二、模版函数三、循环标签四,volist 循环标签五,if 判断标签六,switch 判断标签七、包含文件八、其他标签1. 条件标签2. 比较标签3. 循环标签4. 杂项标签 总结 前言 ThinkPHP视图基本语法和PHP语法非常的像,所…

React Native 9个好用的开发工具盘点

近几年在大前端的开发领域,选择跨端方案的公司和部门越来越多,曾一何时市面有不下10种跨端框架,但随着“生物进化论”的推动,目前市面上仅剩两种主流方案,就是经常听到的 React Native 和 Flutter。去年终于引来了 Rea…

企业网络安全漏洞分析及其解决_kaic

摘要 为了防范网络安全事故的发生,互联网的每个计算机用户、特别是企业网络用户,必须采取足够的安全防护措施,甚至可以说在利益均衡的情况下不惜一切代价。事实上,许多互联网用户、网管及企业老总都知道网络安全的要性,却不知道网…

《JavaEE初阶》多线程进阶

《JavaEE初阶》多线程进阶 文章目录 《JavaEE初阶》多线程进阶常见锁策略乐观锁与悲观锁普通互斥锁与读写锁轻量级锁与重量级锁自旋锁与挂起等待锁公平锁和非公平锁可重入锁和不可重入锁 CAS什么是CASCAS的应用场景:CAS 的 ABA 问题什么是CAS 的 ABA 问题解决方案: synchronize…

libxml2交叉编译和移植

编译后的libxml2如果交叉编译环境一致可以直接使用资源-CSDN文库 嵌入式开发过程中实用libxml2进行xml文件的解析、创建、使用。 这里介绍一下该libxml2的交叉编译过程和移植步骤 下载地址 libxml2 各版本下载地址 ftp://xmlsoft.org/libxml2/ ftp://xmlsoft.org/libxml2…

【汽车电子】5分钟了解汽车操作系统(科普篇)

在智能汽车电动汽车的浪潮下,「软件定义汽车」的理念已经成为很多厂家的共识,未来决定汽车个性化差异的不再是马力大小、座椅材质、底盘软硬等,而应该是人工智能、大数据和云计算技术的综合体。 要想实现这一切,就要给汽车安装一个…

【论文简述】WT-MVSNet: Window-based Transformers forMulti-view Stereo(arxiv 2023)

一、论文简述 1. 第一作者:Jinli Liao、Yikang Ding 2. 发表年份:2023 3. 发表期刊:arxiv 4. 关键词:MVS、3D重建、Transformer、极线、几何约束 5. 探索动机:然而,在没有极几何约束的情况下匹配参考图…

【Java数据结构】二叉树

二叉树 树型结构概念树中的概念树的表现形式 二叉树两种特殊的二叉树二叉树的性质二叉树的存储二叉树基本操作 树型结构 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像…

读论文--Token Merging for Fast Stable Diffusion(用于快速Diffusion模型的tome技术)

摘要 The landscape of image generation has been forever changed by open vocabulary diffusion models. However, at their core these models use transformers, which makes generation slow. Better implementations to increase the throughput of these transformers …

JMeter的使用(一)

JMeter的使用 参考黑马视频 下载工具 一、准备工作 1、准备文件sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for sys_follow_user -- ---------------------------- DROP TABLE IF EXISTS sys_follow_user; CR…

Html5惯性小鸟游戏制作与分享(怀旧小游戏)

当年电子词典中的经典游戏,后来出了无数变种的玩法。这里还原了最初的玩法与操作。实现了这一款有点难度“的怀旧经典游戏。 玩法也很简单,不用碰到任何东西、持续下去。。。 可以进行试玩,手机玩起来效果会更好些。 点击试玩 还有很多变种的…

网络安全SQL注入

1.何为Sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注…

发送结构化的网络消息数据

server.cpp #define WIN32_LEAN_AND_MEAN //尽力减少一些其他依赖库的引用 #define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h> #include<WinSock2.h> #include<stdio.h> //#pragma comment(lib,"ws2_32.lib")struct DataPackage {int …