设计模式-创建型-04-建造者模式

news2024/11/24 13:22:51

1、盖房项目需求

  • 1)需要建房子:这一过程为打桩、砌墙、封顶
  • 2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的
  • 3)请编写程序,完成需求

传统方式
在这里插入图片描述

public abstract class AbsHouse {
    protected abstract void piling();

    protected abstract void walling();

    protected abstract void capping();

    public void build() {
        piling();
        walling();
        capping();
    }
}

public class NormalRoom extends AbsHouse {
    @Override
    protected void piling() {
        System.out.println("普通房打桩...");
    }

    @Override
    protected void walling() {
        System.out.println("普通房砌墙...");
    }

    @Override
    protected void capping() {
        System.out.println("普通房封顶...");
    }
}

public class HighRise extends AbsHouse {
    @Override
    protected void piling() {
        System.out.println("高楼打桩...");
    }

    @Override
    protected void walling() {
        System.out.println("高楼砌墙...");
    }

    @Override
    protected void capping() {
        System.out.println("高楼封顶...");
    }
}

public class Villa extends AbsHouse {
    @Override
    protected void piling() {
        System.out.println("别墅打桩...");
    }

    @Override
    protected void walling() {
        System.out.println("别墅砌墙...");
    }

    @Override
    protected void capping() {
        System.out.println("别墅封顶...");
    }
}

问题分析

  • 1)优点是比较好理解,简单易操作
  • 2)设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好。也就是说,这种设计方案把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性增强了
  • 3)解决方案:将产品和产品建造过程解耦 ==> 建造者模式

2、基本介绍

  • 1)建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
  • 2)建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节
    在这里插入图片描述

3、建造者模式的四个角色

  • 1)Product(产品角色):一个具体的产品对象
  • 2)Builder(抽象建造者):可建一个 Product 对象的各个部件指定的接口 / 抽象类
  • 3)ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
  • 4)Director(指挥者):构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用
    • 一是隔离了客户与对象的生产过程
    • 二是负责控制产品对象的生产过程

4、建造者模式原理类图

在这里插入图片描述

5、建造者模式解决盖房需求

需要建房子:这一过程为打桩、砌墙、封顶。不管是普通房子也好,别墅也好都需要经历这些过程,下面我们使用建造者模式(Builder Pattern)来完成

UML 类图

在这里插入图片描述

//产品角色
public class House {
    private String pile;
    private String wall;
    private String roof;

    public String getPile() {
        return pile;
    }

    public void setPile(String pile) {
        this.pile = pile;
    }

    public String getWall() {
        return wall;
    }

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

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }
}
//抽象建造者
public abstract class HouseBuilder {
    private House house = new House();

    public abstract void piling();
    
    public abstract void walling();
    
    public abstract void capping();

    public House build() {
        return house;
    }
}
//具体建造者1
public class NormalRoomBuilder extends HouseBuilder {
    @Override
    public void piling() {
        System.out.println("普通房打桩...");
    }

    @Override
    public void walling() {
        System.out.println("普通房砌墙...");
    }

    @Override
    public void capping() {
        System.out.println("普通房封顶...");
    }
}
//具体建造者2
public class HighRiseBuilder extends HouseBuilder {
    @Override
    public void piling() {
        System.out.println("高楼打桩...");
    }

    @Override
    public void walling() {
        System.out.println("高楼砌墙...");
    }

    @Override
    public void capping() {
        System.out.println("高楼封顶...");
    }
}
//具体建造者3
public class VillaBuilder extends HouseBuilder {
    @Override
    public void piling() {
        System.out.println("别墅打桩...");
    }

    @Override
    public void walling() {
        System.out.println("别墅砌墙...");
    }

    @Override
    public void capping() {
        System.out.println("别墅封顶...");
    }
}
//指挥者
public class HouseDirector {
    private HouseBuilder houseBuilder;

    public HouseDirector() {
    }

    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    public House buildHouse() {
        houseBuilder.piling();
        houseBuilder.walling();
        houseBuilder.capping();
        return houseBuilder.build();
    }
}

public class BuilderTest {
    public static void main(String[] args) {
        HouseDirector houseDirector = new HouseDirector();
        House house;

        houseDirector.setHouseBuilder(new NormalRoomBuilder());
        house = houseDirector.buildHouse();
        houseDirector.setHouseBuilder(new HighRiseBuilder());
        house = houseDirector.buildHouse();
        houseDirector.setHouseBuilder(new VillaBuilder());
        house = houseDirector.buildHouse();
    }
}

6、JDK 源码分析

java.lang.StringBuilder 中的建造者模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
角色分析

  • Appendable接口定义了多个append方法(抽象方法),即Appendable为抽象建造者,定义了抽象方法
  • AbstractStringBuilder实现了Appendable接口方法,这里的AbstractStringBuilder已经是建造者,只是不能实例化
  • StringBuilder既充当了指挥者角色,又充当了具体的建造者,建造方法的实现是由AbstractStringBuilder完成,StringBuilder继承了AbstractStringBuilder

7、注意事项及细节

  • 1)客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  • 2)每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
  • 3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
  • 4)增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
  • 5)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
  • 6)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。因此在这种情况下,要考虑是否选择建造者模式

8、抽象工厂模式 VS 建造者模式

抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。

而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品

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

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

相关文章

解决linux jenkins要求JDK版本与项目版本JDK不一致问题

背景–问题描述: 新入职公司,交接人说jenkins运行有问题,现在都是手动发布,具体原因让我自己看(笑哭)。我人都蒙了,测试环境都手动发布,那不是麻烦的要死! 接手后&am…

bfs+枚举,CF666B - World Tour

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 666B - Codeforces 二、解题报告 1、思路分析 数据量允许跑N次bfs预处理所有点的最短路,以及预处理到达每个点距离最远的3个点,以及每个点能够到达的最远的3个点 我们枚举…

计算机网络(5) ARP协议

什么是ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定…

边缘网关在智能制造工厂中的创新应用及效果-天拓四方

在数字化浪潮席卷之下,智能制造工厂正面临着前所未有的数据挑战与机遇。边缘网关,作为数据处理与传输的关键节点,在提升工厂运营效率、确保数据安全方面发挥着日益重要的作用。本文将通过一个具体案例,详细阐述边缘网关在智能制造…

华为云DDoS攻击下的应对策略

当华为云上的服务遭遇大规模DDoS攻击导致网络流量异常,触发了华为云的自动防护机制,即所谓的“黑洞”状态时,服务将暂时无法访问,直至攻击停止或流量恢复正常。本文将探讨如何在这一情况下,通过引入第三方安全产品来快…

如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘

如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘 史新华 隐藏式一体化智能电动窗帘与市面上其他窗帘不同的是,电机内置于轨道之中,一体化,美观、安静、滑动顺畅。 每次都会自动打开和关闭,相当漂亮。 众多家庭…

【精品方案】大型企业数字化转型管控平台解决方案(55页PPT),干货满满!

引言:随着信息技术的飞速发展,数字化转型已成为大型企业提升竞争力、实现持续创新的必经之路。本解决方案旨在为企业提供一套全面、高效、灵活的数字化转型管控平台,助力企业实现业务流程的数字化重构、数据资产的智能管理以及决策过程的精准…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 🍉人工智能在制造业中的应用 🍈 应用场景及便利 🍍生产线自动化 🍍质量控制 🍍预测性维护 🍍供应链优化 🍈 技术实现及核心 🍍机器学习和…

【吊打面试官系列-Mysql面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好,我是锋哥。今天分享关于 【MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?】面试题,希望对大家有帮助; MySQL 数据库作发布系统的存储,一天五万条以上的增量…

R语言统计分析——图形文本、自定义坐标轴和图例

参考资料&#xff1a;R语言实战【第2版】 我们可以在图形上添加标题&#xff08;main&#xff09;、副标题&#xff08;sub&#xff09;、坐标轴标签&#xff08;xlab、ylab&#xff09;并指定标轴范围&#xff08;xlim、ylim&#xff09;。 # 录入数据 dose<-c(20,30,40,4…

JAVA反编译工具-CFR(class单个反编译、JAR包整体反编译)

环境说明 1、win10 2、JAVA8&#xff08;环境变量要配置好&#xff09; 3、cfr版本&#xff1a;C:\Users(xx)当前用户\cfr-0.152.jar 4、命令行操作路径&#xff1a;C:\Users(xx)当前用户 5、示例反编译jar包&#xff1a;C:\Users(xx)当前用户\ruoyi-admin.jar CFR工具相关参…

HarmonyOs修改应用名称和图标方法

最近在开发Harmony应用&#xff0c;发现修改app.json5下的lable:app_name和icon不生效 后来经过查找&#xff0c;原来还需要更改entry下的src/main/module.json5才行&#xff0c;具体操作路径是&#xff1a; 更改后生效&#xff1a;

LeetCode刷题之HOT100之不同的二叉搜索树

1、题目描述 2、逻辑分析 给定一个有序序列 1⋯n&#xff0c;为了构建出一棵二叉搜索树&#xff0c;我们可以遍历每个数字 i&#xff0c;将该数字作为树根&#xff0c;将 1⋯(i−1) 序列作为左子树&#xff0c;将 (i1)⋯n 序列作为右子树。接着我们可以按照同样的方式递归构建…

读AI未来进行式笔记11丰饶时代与奇点

1. 第四次工业革命 1.1. 在AI轰轰烈烈地拉开第四次工业革命帷幕的同时&#xff0c;一场清洁能源革命也紧锣密鼓地展开 1.1.1. 清洁能源革命好比一场“及时雨”&#xff0c;不但将解决日益加剧的全球气候变化问题&#xff0c;而且会大幅降低全世界的电力成本 1.1.2. 人们将致…

谷歌发布HyperDreameBooth:单张人像20秒内完成模型训练,速度比DreamBooth快25倍,模型小10000倍

HyperDreamBooth是谷歌去年发布的革命性模型训练方法&#xff0c;单张人像20秒内完成模型训练&#xff0c;速度比DreamBooth快25倍&#xff0c;模型小10000倍&#xff0c;但是没有不开源。 今年&#xff0c;论文《HyperDreamBooth: HyperNetworks for Fast Personalization of…

【沟通管理】项目经理《葵花宝典》之跨部门沟通

为什么每次跟其它部门的沟通总是不欢而散&#xff1f; 为什么每次想好好的就事论事的时候&#xff0c;却总是像在吵架&#xff1f; 为什么沟通总是不同频&#xff1f; 这是不是你作为项目经理在跨部门沟通时经常会遇到的问题&#xff1f; 在企业项目管理中&#xff0c;跨部门沟…

32岁TVB「最强关系户」快速上位,嫁巨星家族屡传婚变。

现年32岁的王敏奕贵为总经理曾志伟的新抱,经常被外界以「家嫂」称呼,而王敏奕近年亦凭出色演技获大赞,继在TVB剧集《婚后事》中饰演Mira一角,介入陈自瑶与罗子溢的婚姻,被封为「港版最美小三」之后,早前在剧集《家族荣耀之继承者》中大展「哭功」,获观众激赞! 除了演技…

平板消解加热台-温度均匀,防腐蚀-实验室化学分析

DBF系列防腐电热板 是精致路合金加热板块表面经进口高纯实验级PFATeflon氟塑料防腐不粘处理&#xff0c;专为实验室设计的电加热产品&#xff0c;是样品前处理中&#xff0c;加热、消解、煮沸、蒸酸、赶酸等处理的得力助手。可以满足物理、化学、生物、环保、制药、食品、饮品…

国内院线电影票api接口如何开发小程序

要开发一个基于国内院线电影票API接口的小程序&#xff0c;你需要遵循以下步骤&#xff1a; 1. 确定API提供方 首先&#xff0c;你需要确定一个提供电影票API接口的服务商。这可能是一个电影票务平台、院线自己的API服务&#xff0c;或者是一个第三方的数据提供商。 2. 阅读…

opencv roi改进版

点击鼠标左键开始画roi,右键或者回车代表画框完毕 并且做了封装。 import cv2 import numpy as npclass ROIDrawer:def __init__(self, image_path):self.drawing = Falseself.ix, self.iy = -1, -1self.roi = Noneself.image_o = cv2.imread(image_path)self.image = self.…