JAVA设计模式-建造者模式

JAVA设计模式-建造者模式

介绍

建造者模式是通过一步一步的步骤构建一个包含多个部件的对象,每个不同的对象都是具有相同的构建过程。适用于复杂对象的构建,用户不需要知道具体的构建细节,只需要指定对象的类型即可。建造者模式将对象的构建和装配进行了解耦,可以使用不同的构建器,相同的装配过程构造出不同的对象。

场景

适用于一个复杂的对象,这个对象是由多个对象或者简单的属性组合而成,再通过稳定的一系列构造步骤一步步的构造出来。

主要内容

抽象的建造者类(Builder): 为创建一个复杂对象的各个部件指定抽象的接口,但是不实现这些具体部件的创建,每个具体部件的创建由具体的建造者来完成。
具体的建造者类(ConcreteBuilder): 实现上方的Builder接口,并且实现抽象接口里面每个部件的具体的实现,在部件全部构造完成后也会提供一个返回这个复杂对象的方法。
Director: 构造一个使用了Builder接口的具体的对象,它会调用具体的建造者类来创建具体的复杂对象每个部件,最后返回这个对象。Director里面不涉及具体的对象的任何信息,只包装这个复杂对象的各个部件的正确创建并且按照一定的构建顺序构建。
Product: 需要被构造的复杂对象。

代码示例

Computer类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:45 下午
 */
public class Computer {

    /**
     * CPU
     */
    private String cpu;
    /**
     * 主板
     */
    private String mainBoard;
    /**
     * 内存
     */
    private String memory;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMainBoard() {
        return mainBoard;
    }

    public void setMainBoard(String mainBoard) {
        this.mainBoard = mainBoard;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }
}

ComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑接口
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:43 下午
 */
public interface ComputerBuilder {

    /**
     * 构建CPU
     */
    void buildCpu();

    /**
     * 构建主板
     */
    void buildMainBoard();

    /**
     * 构建内存
     */
    void buildMemory();

    Computer buildComputer();
}

OfficeComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 办公电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:52 下午
 */
public class OfficeComputerBuilder implements ComputerBuilder {

    Computer computer;

    public OfficeComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("办公电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("办公电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("办公电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }
}

GameComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 办公电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:52 下午
 */
public class GameComputerBuilder implements ComputerBuilder {

    Computer computer;

    public GameComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("游戏电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("游戏电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("游戏电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }
}

ComputerDirector类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑构造指挥者
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:58 下午
 */
public class ComputerDirector {

    public Computer assemble(ComputerBuilder cb) {
        cb.buildCpu();
        cb.buildMainBoard();
        cb.buildMemory();
        return cb.buildComputer();
    }

    public static void main(String[] args) {
        Computer officeComputer = new ComputerDirector().assemble(new OfficeComputerBuilder());
        Computer gameComputer = new ComputerDirector().assemble(new GameComputerBuilder());
    }
}

扩展

简化结构

简化构造结构,可以将ComputerDirector里面的装配放到每个Builder里面,但是这样会导致每个Builder的职责增加,不符合软件设计原则中的单一职责原则。

代码示例

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 平板电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 4:30 下午
 */
public class TabletComputerBuilder implements ComputerBuilder {

    Computer computer;

    public TabletComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("平板电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("平板电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("平板电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }

    public Computer assemble() {
        this.buildCpu();
        this.buildMainBoard();
        this.buildMemory();
        return this.buildComputer();
    }

    public static void main(String[] args) {
        Computer tabletComputer = new TabletComputerBuilder().assemble();
    }
}

第二种创建对象方法

我们创建对象时总会要传入一些参数,如果每个都是放在构造方法里面传入,这样可能会参数很多,代码可读性差,对应不上可能还会导致传入错误,我们可以使用构造者模式并且支持链式调用解决参数过多问题。

代码示例

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 工控机
 * @Author: xpy
 * @Date: Created in 2022年09月21日 4:30 下午
 */
public class IpcComputerBuilder {

    Computer computer;

    public IpcComputerBuilder() {
        this.computer = new Computer();
    }

    public IpcComputerBuilder buildCpu(String cpu) {
        computer.setCpu(cpu);
        return this;
    }

    public IpcComputerBuilder buildMainBoard(String mainBoard) {
        computer.setMainBoard("平板电脑主板");
        return this;
    }

    public IpcComputerBuilder buildMemory(String memory) {
        computer.setMemory("平板电脑内存");
        return this;
    }

    public Computer buildComputer() {
        return computer;
    }

    public static void main(String[] args) {
        Computer computer = new IpcComputerBuilder().buildCpu("工控机CPU").buildMainBoard("工控机主板").buildMemory("工控机内存").buildComputer();
    }
}

原文链接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi—jian-zao-zhe-mo-shi

Original: https://www.cnblogs.com/aibianchengya/p/16716302.html
Author: 程序猿的代码
Title: JAVA设计模式-建造者模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577824/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 微步蜜罐部署

    1.下载安装包HFish-Windows-amd64 (Windows x86 架构 64 位系统),解压缩 下载地址反制溯源_欺骗防御_主动防御-HFish免费蜜罐平台 2.进入…

    Linux 2023年6月14日
    091
  • 唯一主键方案之数据库维护区间分配

    我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。 使用这种方式首先在数据库中创建 sequence 表,其…

    Linux 2023年6月16日
    0207
  • mysql基本操作

    mysql常用命令: 1查询数据库 show database; 2切换库 use test; 3查看库里的表 show tables; 4查看表里的字段 desc tb_name…

    Linux 2023年6月6日
    091
  • 演示webuploader和cropperjs图片裁剪上传

    最近有个项目要在浏览器端裁剪并上传图片。由于缺乏人力,只能我上阵杀敌。通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件。本文涉及到的知识…

    Linux 2023年6月6日
    098
  • k4t系统架构 & 部署最佳实践

    《kaiiit船长》 容器自动管理软件 (k4t,国产k8s) k4t系统架构 & 部署最佳实践 文档修订时间: 2021-11-20 关键词 : k4t kaiiit 船…

    Linux 2023年6月13日
    095
  • FusionAccess桌面云安装(Lite AD方法)

    创建FusionAccess虚拟机 选择自定义 默认兼容 选择稍后安装操作系统 选择Linux SUSE Linux 名字位置自己选择 选择最少4个处理器 选择最少8G内存 选择仅…

    Linux 2023年6月8日
    0105
  • [apue] linux 文件系统那些事儿

    前言 说到 linux 的文件系统,好多人第一印象是 ext2/ext3/ext4 等具体的文件系统,本文不涉及这些,因为研究具体的文件系统难免会陷入细节,甚至拉大段的源码做分析,…

    Linux 2023年5月27日
    099
  • 你的团队工作量饱和吗?

    参与软件开发的相关人员,虽然称为工程技术人员,但本质上其实就是手艺人。手艺嘛肯定是一技之长,里面多少有些门道,外行人做不了, 也很难完全搞清楚其中的门道,合作过程中就怕被坑上当 :…

    Linux 2023年6月13日
    081
  • 安装clearos系统

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 一、clearos介绍 ClearOS是一个基于CentOS和Red Hat Enterprise Linux的简单,开源,价格…

    Linux 2023年5月27日
    091
  • MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu……

    报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu…… 原因: 1、第一次配置参数时,不完整…

    Linux 2023年6月13日
    0108
  • RPA SAP财务内部对账机器人

    bash;gutter:true;【简介】本机器人用于使用SAP软件的集团公司间往来对账前台登录SAP账户和密码,需退出PC微信,输入法切换为英文半角状态。【详细流程】1、清空Ex…

    Linux 2023年6月7日
    0117
  • SHELL编程-牛客网题目(持续更新..)

    SHELL编程题目及solution (牛客网) 描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数示例:假设 nowcoder.txt 内容如下: #…

    Linux 2023年6月7日
    087
  • burp通过条件竞争上传文件

    一·何为条件竞争现代框架更能抵御此类攻击。他们通常不会将文件直接上传到文件系统上的预期目的地。相反,他们采取了预防措施,例如首先上传到临时的沙盒目录并随机命名以避免覆盖现有文件。然…

    Linux 2023年6月7日
    080
  • CentOS系统磁盘目录空间调整

    前几天装了几台linux服务器,安装操作系统的时候,选择了默认磁盘分区,结果导致后面主目录分区空间不够用了,需要把其他分区的空间划分给主分区一点。 下面以CentOS6.5演示: …

    Linux 2023年6月6日
    094
  • flask操作(增删改查操作)

    增加数据 from .models import Goods from app.extensions import db goods1 = Goods(name=’魅族18s’, …

    Linux 2023年6月8日
    092
  • Linux内核模块管理(命令)

    1.什么是 Linux 内核模块? 内核模块是可以根据需要加载到内核中或从内核中卸载的代码块,因此无需重启就可以扩展内核的功能。事实上,除非用户使用类似lsmod这样的命令来查询模…

    Linux 2023年6月8日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球