【设计模式--创建型--建造者模式】

建造者模式

    • 建造者模式
      • 概述
      • 结构
      • 结果
      • 优缺点
      • 使用场景
    • 将上述案例改为链式调用
      • 结果

建造者模式

概述

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

  • 分离了部件的构建(由Builder来负责)和装配(由Director负责)。从而可以构建出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。实现了更好的复用。
  • 建造者模式可以将部件与其组装过程分开,一步一步创建一个复杂对象。用户只需要指定复杂对象的类型就可以获得该对象,而无需知道内部的构造细节。

结构

建造者(Builder)模式包含如下角色:

  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
  • 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
  • 产品类(Product):要创建的复杂对象
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各个部分完整创建或按某种顺序创建。
    类图:
    在这里插入图片描述
/*** 抽象建造者类*/
public abstract class Builder {// 声明computer类型的变量,并赋值protected Computer computer = new Computer();public abstract Computer createComputer();public abstract void builderMemory();public abstract void builderHardDrive();public abstract void builderMotherBoard();public abstract void builderPowerSource();public abstract void builderCpu();
}
/*** 电脑类*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getHardDrive() {return hardDrive;}public void setHardDrive(String hardDrive) {this.hardDrive = hardDrive;}public String getMotherBoard() {return motherBoard;}public void setMotherBoard(String motherBoard) {this.motherBoard = motherBoard;}public String getPowerSource() {return powerSource;}public void setPowerSource(String powerSource) {this.powerSource = powerSource;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
/*** 指挥者类*/
public class Director {// 声明builder类型的变量private Builder builder;public Director(Builder builder){this.builder =builder;}// 组装电脑public Computer construct(){builder.builderMotherBoard();builder.builderCpu();builder.builderMemory();builder.builderHardDrive();builder.builderPowerSource();return builder.createComputer();}
}
/*** 联想电脑构建者 实现抽象构建者类*/
public class LXComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("8G");}@Overridepublic void builderHardDrive() {computer.setMemory("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("一块好板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("600w");}@Overridepublic void builderCpu() {computer.setCpu("i5");}
}
/*** 惠普电脑构建者 实现抽象构建者类*/
public class PHComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("16G");}@Overridepublic void builderHardDrive() {computer.setHardDrive("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("普通的主板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("500w");}@Overridepublic void builderCpu() {computer.setCpu("i7");}
}
public class Test01 {public static void main(String[] args) {// 创建指挥者类,传入惠普电脑构建者类Director director = new Director(new PHComputerBuilder());// 调用指挥者类的构建方法,构建惠普电脑Computer construct = director.construct();System.out.println(construct.toString());}
}

结果

在这里插入图片描述

优缺点

  • 优点:
    • 建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而而言可以取得比较好的稳定性。
    • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    • 可以更加精细的控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也方便使用程序来控制创建过程。
    • 建造者模式很容易进行扩展。如果由新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前的代码,符合开闭原则。
  • 缺点:
    • 建造者模式所创建的产品一般具有较多共同点,其组成部分相似,如果产品之间差异很大,则不适用建造者模式,因此使用范围受到一定的限制。

使用场景

建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临剧烈的变化,但是将他们组合在一起的算法却相对稳定,所有通常在一下场合使用:

  • 创建的对象较复杂,由多个部件构成,各部件面临复杂变化,但构建顺序是相对稳定的
  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的

将上述案例改为链式调用

在这里插入图片描述

/*** 电脑类*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;// 构造方法public Computer(Builder builder) {this.cpu = builder.cpu;this.hardDrive = builder.hardDrive;this.motherBoard = builder.motherBoard;this.powerSource = builder.powerSource;this.memory = builder.memory;}// 将创建者声明为静态内部类public static final class Builder {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public Builder cpu(String cpu){this.cpu = cpu;return this; // 直接返回 this,即 Builder对象}public Builder powerSource(String powerSource){this.powerSource = powerSource;return this;}public Builder motherBoard(String motherBoard){this.motherBoard = motherBoard;return this;}public Builder hardDrive(String hardDrive){this.hardDrive = hardDrive;return this;}public Builder memory(String memory){this.memory = memory;return this;}// 直接调用Computer类的构造方法,传入this,即 Builder对象public Computer build(){return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
public class Test02 {public static void main(String[] args) {Computer computer = new Computer.Builder().cpu("i9").hardDrive("2T").memory("32G").powerSource("1000w").motherBoard("华硕").build();System.out.println(computer);}
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于JavaWeb+SSM+Vue马拉松报名系统微信小程序的设计和实现

基于JavaWebSSMVue马拉松报名系统微信小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.…

C语言-每日刷题练习

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果…

记录一次云原生线上服务数据迁移全过程

文章目录 背景迁移方案调研迁移过程服务监控脚本定时任务暂停本地副本服务启动,在线服务下线MySQL 数据迁移Mongo 数据迁移切换新数据库 ip 本地服务启动数据库连接验证服务打包部署服务重启前端恢复正常监控脚本定时任务启动旧服务器器容器关闭 迁移总结 背景 校园…

头歌-Python 基础

第1关:建模与仿真 1、 建模过程,通常也称为数学优化建模(Mathematical Optimization Modeling),不同之处在于它可以确定特定场景的特定的、最优化或最佳的结果。这被称为诊断一个结果,因此命名为▁▁▁。 填空1答案:决…

通过生成模拟释放无限数据以实现机器人自动化学习

该工作推出RoboGen,这是一种生成机器人代理,可以通过生成模拟自动大规模学习各种机器人技能。 RoboGen 利用基础模型和生成模型的最新进展。该工作不直接使用或调整这些模型来产生策略或低级动作,而是提倡一种生成方案,该方案使用…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 (1)在vite.config.js中开启 (2)子组件 (3)父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢?这里有这样一种场景&…

指针(笔记1)

一、内存和地址 内存及其管理方法: 1.计算机主存储器由一个一个存储单元组成,微型计算机以字节作为存储单元 2.内存区的每一个字节有一个唯一的编号,这就是“地址”,它相当于教学楼中的教室号 3.内存地址,是一个无符号整数(un…

【Spring教程24】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例代码示例

目录 1:创建Maven项目,并导入对应的jar包2:创建控制器类3:创建配置类4:创建Tomcat的Servlet容器配置类5:配置Tomcat环境6:启动运行项目7:浏览器访问8:知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现&#xff0…

异常检测 | 基于孤立森林(Isolation Forest)的数据异常数据检测(结合t-SNE降维可视化)

异常检测 | MATLAB实现基于孤立森林的数据异常检测 目录 异常检测 | MATLAB实现基于孤立森林的数据异常检测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于孤立森林(Isolation Forest)的数据异常数据检测可视化(完整源码和数据) 基于孤立森林(…

【小白专用】Apache2.4+PHP8.3+MYSQL的配置

1.下载PHP和Apache 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意: 1.使用Apache作为服务器的话,一定要下载Thread Safe的,否则没有php8apache2_4.dll这个文件, 如果使用IIS的请下载 NON Tread safe的 2.如果…

【c++随笔16】reserve之后,使用std::copy会崩溃?

【c随笔16】reserve之后,使用std::copy会崩溃? 一、reserve之后,使用std::copy会崩溃?二、函数std::reserve、std::resize、std::copy1、std::resize:2、std::reserve:3、std::copy: 三、崩溃原因分析方案1、你可以使…

基于以太坊的智能合约开发Solidity(基础篇)

参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili 1、第一个程序——Helloworld: //声明版本号(程序中的版本号要和编译器版本号一致) pragma solidity ^0.5.17; //合约 contract HelloWorld {//合约属性变…