设计模式--建造者模式 builder

news2024/11/26 5:31:58

设计模式--建造者模式 builder)

  • 建造者模式简介
  • 建造者模式--小例子(电脑购买)
    • 1.产品类
    • 2.抽象构建者
    • 3.实体构建类
    • 4.指导者类
    • 5.客户端测试类
  • 小结

建造者模式简介

建造者模式有四个角色,概念划分如下:

  • Product : 产品类,最终要生成的对象(例如:一台电脑)。
  • Builder :构建者的抽象基类或则抽象接口。定义了Product产品的生产流程的抽象步骤(比如一台电脑可以在出厂的时候就将所有外设配件搭载齐全,也可以只是原装的一台电脑,外设需要自己从别的地方购买)。
  • ConcreteBuilder :Builder的实现类。
  • Direcotr : 决定如何构建最终产品的算法逻辑,多个方法Construct(Builder builder){//方法体}(例如:你是要买一台外设齐全的电脑,还是一台没有任何外设的原装电脑),最后通过Builder.getProduct()获得最终的产品。

类图如下(直接将韩老师的图拿过来了):
在这里插入图片描述

建造者模式–小例子(电脑购买)

购买一台电脑,可以买完整的包括所有外设的电脑,也可以买只有电脑本身无任何外设配件的电脑(且电脑品牌很多,联想华硕,可以自行选择电脑的cpu和主板,若买外设配件时,则根据购买电脑品牌来添加对应品牌外设)。
在这里插入图片描述

1.产品类

电脑CPU和主板都为必选,其余外设可不选。

package com.robin.builder;

// 一台完整的电脑产品
public class Computer {

    private String cpu; // cpu 必选
    private String mouse; // 鼠标 可选
    private String monitor; // 屏幕显示器 可选
    private String keyBoard; // 键盘 可选
    private String mainBoard; // 主板 必选


    // cpu和主板为必选,其余配件可以自行选择
    public Computer(String cpu, String mainBoard) {
        this.cpu = cpu;
        this.mainBoard = mainBoard;
    }

    // 对可选的配件提供setter方法
    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public void setKeyBoard(String keyBoard) {
        this.keyBoard = keyBoard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", mouse='" + mouse + '\'' +
                ", monitor='" + monitor + '\'' +
                ", keyBoard='" + keyBoard + '\'' +
                ", mainBoard='" + mainBoard + '\'' +
                '}';
    }
}

2.抽象构建者

抽象构建者:

package com.robin.builder;

// 抽象构建者
public abstract class ComputerBuilder {

    public abstract Computer getComputer();

    public abstract void setMouse();

    public abstract void setMonitor();

    public abstract void setKeyBoard();

}

3.实体构建类

两个不同品牌的电脑实体构建类:

联想:

package com.robin.builder;

// 品牌电脑实体构建者类
public class LenovoComputerBuilder extends ComputerBuilder{

    private Computer computer;

    public LenovoComputerBuilder(String cpu, String mainBoard) {
        computer = new Computer(cpu, mainBoard);
    }

    @Override
    public Computer getComputer() {
        return computer;
    }

    @Override
    public void setMouse() {
        computer.setMouse("[lenovo]鼠标");
    }

    @Override
    public void setMonitor() {
        computer.setMonitor("[lenovo]240Hz高刷显示器");
    }

    @Override
    public void setKeyBoard() {
        computer.setKeyBoard("[lenovo]机械键盘");
    }
}

华硕:

package com.robin.builder;

public class ASUSComputerBuilder extends ComputerBuilder{

    private Computer computer;

    public ASUSComputerBuilder(String cpu,String mainBoard) {
        computer = new Computer(cpu, mainBoard);
    }

    @Override
    public Computer getComputer() {
        return computer;
    }

    @Override
    public void setMouse() {
        computer.setMouse("[华硕]鼠标");
    }

    @Override
    public void setMonitor() {
        computer.setMonitor("[华硕]显示屏");
    }

    @Override
    public void setKeyBoard() {
        computer.setKeyBoard("[华硕]机械键盘");
    }
}

4.指导者类

通过两个方法来确定,创建(购买)何种类型包含何种配件。

package com.robin.builder;

public class ComputerDirector {

    // 包含所有完整配件的电脑
    public void buyCompleteComputer(ComputerBuilder computerBuilder){
        computerBuilder.setMouse();
        computerBuilder.setKeyBoard();
        computerBuilder.setMonitor();
    }

    // 无配件的电脑
    public void buyNoAcesComputer(ComputerBuilder computerBuilder){}
}

5.客户端测试类

package com.robin.builder;

public class Main {
    public static void main(String[] args) {
        // 1.创建指挥者
        ComputerDirector computerDirector = new ComputerDirector();
        // 2.创建实体构造者
        LenovoComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder("i9", "QDI");
        // 3.指挥者调用构造者去设定电脑配件
        computerDirector.buyCompleteComputer(lenovoComputerBuilder);
        // 4.获取电脑产品
        Computer computer1 = lenovoComputerBuilder.getComputer();
        // 5.输出
        System.out.println(computer1);

        // 购买一台华硕电脑,其cpu为i7,主板为华硕,其余配件不进行选择
        ASUSComputerBuilder asusComputerBuilder = new ASUSComputerBuilder("i7", "华硕");
        computerDirector.buyNoAcesComputer(asusComputerBuilder);
        Computer computer2 = asusComputerBuilder.getComputer();
        System.out.println(computer2);
    }
}

在这里插入图片描述

小结

建造者模式是设计模式中创建型的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式实用范围:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同表示时

tip: 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。


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

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

相关文章

docker的基本管理

Docker的概念云计算三层架构服务说明应用IAAS基础设施及服务硬件(服务器、网络设置、防火墙等)虚拟化网络虚拟化(大二层)例:openstackPAAS平台及服务环境例:数据库、 docker 、kubernetesSAAS应用及服务应用…

内网渗透(十四)之内网信息收集-域环境中查找域内用户基本信息

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

终于进了字节,记录一下我作为一名测试员磕磕碰碰的三个月找工作经历...

我是裸辞后重新找工作的,从去年到今年,前前后后花了大概三个月,大大小小参加了几百场面试。不是我说,作为一名测试员是真的挺难的,不过很庆幸自己最后拿到了字节的offer,今天在这里做一下记录吧&#xff0c…

从GPT到ChatGPT:我们离那个理想的AI时代到底还有多远?

写在前面 在2023年新年伊始,科技界最为爆火一款产品无疑是OpenAI公司出品的ChatGPT了,作为一名NLP领域从业者,似乎也好久没有看到如此热闹的技术出圈场景了。诚然从现象来看,无论从效果惊艳度、社会效应、商业价值、科技发展方向…

C++【多态】

文章目录1、多态的概念2、多态的定义及实现2-1、多态的构成条件2-2、虚函数2-3、虚函数的重写2-4 多态样例2-5、协变2-6、 析构函数与virtual2-7、函数重载、函数隐藏(重定义)与虚函数重写(覆盖)的对比2-8、override 和 final&…

spring的简单理解

目录 1 .ioc容器(控制反转) 2. Aop面向切面编程 3. 事务申明 4. 注解的方式启动 5. spring是什么与他的优势 6. 代理设计模式(比如aop) 7. springmvc中相应json数据 8. 使用lombok来进行对代码的简化 9. 使用logback记录…

学习SpringCloudAlibaba(二)微服务的拆分与编写

目录 一、单体架构VS微服务架构 1.单体架构 ​(1).单体架构的优点 (2).单体架构的缺点 2.微服务架构 (1)微服务的特性 (2)微服务架构图 (3)微服务的优点 …

大数据之------------数据中台

一、什么是数据中台 **数据中台是指通过数据技术,对海量数据进行采集、计算、存储、加工,同时统一标准和口径。**数据中台的目标是让数据持续用起来,通过数据中台提供的工具、方法和运行机制,把数据变为一种服务能力,…

ChatGPT使用、原理及问题

引言 2022年11月30日,OpenAI公布了他们的新产品:ChatGPT。随后ChatGPT火得一塌糊涂。通过b站搜索“ChatGPT”的结果: 搞学术的想着从它身上找点创新,吃瓜群众吃着这锅热瓜,想赚钱的眼睛贼亮🌟&#x1f31f…

C++11中function和bind的用法

C11中function和bind的用法一、简介二、std::function的用法2.1、保存普通函数2.2、保存lambda表达式2.3、保存成员函数三、std::bind用法总结一、简介 在设计回调函数的时候,无可避免地会接触到可回调对象。在C11中,提供了std::function和std::bind两个…

云端IDE系列教程6:初识 WeTTY,想说爱你不容易

原文作者:行云创新产品总监 John 概述 今天我们接着上一期的文章《玩转云原生 Terminal 之 TTY 的前世今生》,继续来聊一聊云原生 Terminal。为了在 TitanIDE 上玩转云原生 Terminal ,首先找到了 WeTTY,在这个过程中,…

ITSM | 限时优惠,帮助您的团队终结不良服务管理!

不良服务管理(Bad Service Management ,简称BSM)是一种糟糕的状况,困扰着使用传统ITSM工具的公司。现在,它已经在许多IT团队中蔓延,并迅速攻击业务的其他领域,使他们无法处理来自不同业务领域的…

ROS2机器人编程简述humble-第四章-AN OBSTACLE DETECTOR THAT USES TF2 .1

如何检测一个障碍物呢?视觉、雷达?可视化效果如何?机器人所装备的传感器例如感知设备,主要负责环境的获取和识别。然后,结果发送给电机控制运动,在环境中自主、智能决策和规划。需要先简单看一下仿真可视化…

一篇带你MySQL运维

1. 日志 1.1 错误日志 错误日志是 MySQL 中 重要的日志之一,它记录了当 mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&…

全栈自动化测试技术笔记(二):准备工作的切入点

自动化测试技术笔记(二):准备工作的切入点 上篇整理的技术笔记,聊了自动化测试的前期调研工作如何开展,最后一部分也提到了工作的优先级区分。 这篇文章,接上篇文章的内容,来聊聊自动化测试前期的准备工作&#xff0…

插件 sortablejs:HTML元素可拖动排序

插件 sortablejs 用于可重新排序拖放列表的JavaScript库&#xff1b;关键链接&#xff1a;npm 地址 Github 地址 安装 npm i sortablejs引入 import Sortable from "sortablejs"HTML <ul id"items"><li>item 1</li><li>item …

Sentinel降级和热点Key限流

目录 一、降级规则 &#xff08;一&#xff09;官网 &#xff08;二&#xff09;基本介绍 &#xff08;三&#xff09;降级策略实战 二、热点key限流 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;官网 &#xff08;三&#xff09;测试 &#xff08…

谷粒学苑第二章前端框架-2.2前端框架开发过程

一、前端框架开发过程 第一步&#xff1a;添加路由 src/router模块用来管理路由。 第二步&#xff1a;点击某个路由&#xff0c;显示路由对应页面内容 component: () > import(/views/table/index), 表示路由对应的页面&#xff0c;是views/table/index.vue页面 第三步&a…

vue的生命周期函数不能使用箭头函数

如果使用过react和vue&#xff0c;应该发现过一个问题&#xff1a;vue告诉我们不应该把方法、生命周期用箭头函数去定义&#xff1b;而在react的类组件中&#xff0c;把方法写成箭头函数的形式却更方便。 要问其原因&#xff0c;大部分人都只把他当一个理所当然的规定。但把这…

Myba tis基础2

接口代理方式代理开发方式介绍编写StudentMapper接口测试代理方式小结动态sql语句动态 SQL 之<**if>**动态 SQL 之<**foreach>**SQL片段抽取分页插件介绍分页插件的使用分页插件的参数获取小结MyBatis的多表操作多表模型介绍多表模型一对一操作多表模型一对多操作多…