二十三种设计模式第六篇--建造者模式(也叫生成器)

news2024/11/17 13:40:27

建造者模式(Builder Pattern)是使用多个简单的对象一步一步(顺序构建)构建成一个复杂的对象, 这种类型的设计模式属于创建型模式,他提供了一种创建对象的最佳方式。
一个Builder类会一步一步构建成为最终的对象,并且Builder是独立于其他对象的。

介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,
这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例:
1、JAVA 中的 StringBuilder .append()
2、JDk中的 DocumentBuilder(org.w3c.dom)

优点:
1、建造者独立,易扩展。
2、便于控制细节风险。

缺点:
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。

使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

在这里插入图片描述
其中:

  • Builder为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
  • Director构造一个使用Builder接口的对象。
  • Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。

适用性
Builder 模式适用于:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。
public class Main {
    public static void main(String[] args) {
        Director director = new Director();

        Builder builder1 = new Builder1();
        director.Construct(builder1);
        Product product1 = builder1.getResult();
        product1.show();

        Builder builder2 = new Builder2();
        director.Construct(builder2);
        Product product2 = builder2.getResult();
        product2.show();
    }
}
abstract class Builder {
    public abstract void BuildPart();
    public abstract Product getResult();
}
class Builder1 extends Builder {
    Product product = new Product();

    @Override
    public void BuildPart() {
        product.Add("A");
        product.Add("B");
        product.Add("C");
        product.Add("D");
        product.Add("E");
        product.Add("F");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
class Builder2 extends Builder {
    Product product = new Product();

    @Override
    public void BuildPart() {
        product.Add("A");
        product.Add("B");
        product.Add("C");
    }
     @Override
    public Product getResult() {
        return product;
    }
}
class Product {
    List<String> parts = new ArrayList<String>();

    public void Add(String part) {
        parts.add(part);
    }

    public void show() {
        System.out.print("产品的组成:");
        for (String s : parts)
            System.out.print(s + " ");

        System.out.print("\n");
    }
}

实例二:

在这里插入图片描述

public class Actor {

    private String type="a"; //角色类型
    private String sex="男"; //性别
    private String face="方形"; //脸型
    private String costume="beauty"; //服装

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getFace() {
        return face;
    }

    public void setFace(String face) {
        this.face = face;
    }

    public String getCostume() {
        return costume;
    }

    public void setCostume(String costume) {
        this.costume = costume;
    }

    @Override
    public String toString() {
        return "Actor{" +
                "type='" + type + '\'' +
                ", sex='" + sex + '\'' +
                ", face='" + face + '\'' +
                ", costume='" + costume + '\'' +
                '}';
    }
}
public abstract class ActorBuilder {
    protected Actor actor = new Actor();

    public abstract void buildType();

    public abstract void buildSex();

    public abstract void buildFace();

    public abstract void buildCostume();

    //工厂方法,返回一个完整的游戏角色对象
    public Actor createActor() {
        return actor;
    }
}
public class ActorController {

    //逐步构建复杂产品对象
    public Actor construct(ActorBuilder actorBuilder) {
        Actor actor;
        actorBuilder.buildType();
        actorBuilder.buildSex();
        actorBuilder.buildFace();
        actorBuilder.buildCostume();
        actor = actorBuilder.createActor();
        return actor;
    }
}
public class AngelBuilder extends ActorBuilder {

    @Override
    public void buildType() {
        actor.setType("天使");
    }

    @Override
    public void buildSex() {
        actor.setSex("女");
    }

    @Override
    public void buildFace() {
        actor.setFace("漂亮");
    }

    @Override
    public void buildCostume() {
        actor.setCostume("裙子");
    }
}
public class ClientTest {

    /**
     * 下面是一个使用了建造者设计模式的简单示例程序,其概述为 : 无论是何种游戏角色,都需要逐步创建其组成部分,再将各组成部分配装成一个完整的游戏角色
     */

    public static void main(String[] args) {
        ActorController actorController = new ActorController();

        ActorBuilder zero = new HeroBuilder();
        Actor actor_zero = actorController.construct(zero);
        System.out.println(actor_zero);

        System.out.println("------------------------------");

        ActorBuilder angel = new AngelBuilder();
        Actor actor_angel = actorController.construct(angel);
        System.out.println(actor_angel);
    }
}
public class HeroBuilder extends ActorBuilder {
    @Override
    public void buildType() {
        actor.setType("英雄");
    }

    @Override
    public void buildSex() {
        actor.setSex("男");
    }

    @Override
    public void buildFace() {
        actor.setFace("英俊");
    }

    @Override
    public void buildCostume() {
        actor.setCostume("盔甲");
    }
}

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

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

相关文章

Windows10 WIFI蓝牙图标消失,网卡驱动出现感叹号等无法上网的情况解决方案

Windows10出现WIFI蓝牙图标消失&#xff0c;网卡驱动出现感叹号等无法上网的情况解决方案_飞机跑不快的博客-CSDN博客 问题描述 我的电脑是戴尔游匣G15 5511&#xff0c;由于静电保护的原因&#xff0c;不得不拆开电脑后盖拔掉电池&#xff0c;释放静电&#xff0c;释放完成后…

OpenPCDet系列 | 6.PointPillars模型分类、回归、角度损失的构建

文章目录 模型损失计算1. 分类损失构建1.1 分类损失函数:SigmoidFocalClassificationLoss2. 回归损失构建2.1 回归损失函数:WeightedSmoothL1Loss3. 角度损失构建3.1 角度损失函数:WeightedCrossEntropyLoss4. 总结模型损失计算 在进行anchor的正负样本分配后,具体来说就是…

【运动规划算法项目实战】专栏介绍

文章目录 前言1. 路径规划中常用的插值方法2. 路径规划中常用的抽稀3. 如何加载csv文件的路径信息4. 如何在栅格地图中实现A*算法5. 如何在栅格地图中实现Dijkstra算法6. 如何实现简单的状态机7. 如何实现机器人多目标点导航8. Voronoi图]9. 八叉树地图10. 如何实现三次样条插值…

网安笔记05 SHA

SHA Hash函数 定义 任意长度的数据M变换为定长码h h H A S H ( M ) h H ( M ) h HASH(M)\quad h H(M) hHASH(M)hH(M) 实用性&#xff1a; 给定M&#xff0c;计算h时高效的 安全性&#xff1a; 单向性 给出h&#xff0c;反向计算原文x时不可行的&#xff0c;否则截取…

vcomp140.dll怎么安装?提示vcomp140.dll丢失怎样修复?

在用电脑玩游戏或者打开软件工作的时候&#xff0c;电脑提示vcomp140.dll丢失无法执行此代码&#xff0c;是什么回事呢&#xff1f;需要怎么修复呢&#xff1f;不用紧张&#xff0c;小编今天就把vcomp140.dll文件修复方法分享给大家。我总结了几个修复经验&#xff1b; vcomp14…

IO-概述

概述 ​ IO是Input&#xff08;输入&#xff09;和Output&#xff08;输出&#xff09;的首字母缩写。 ​ I&#xff08;输入Input&#xff09;&#xff1a;指向Java程序中输入数据&#xff0c;即Java程序从外部获取数据。 ​ O&#xff08;输出Output&#xff09;&#xff1a…

c盘游戏怎么转移到d盘?无需重新安装

概述&#xff1a;游戏占用的容量一般很大&#xff0c;如果都存在C盘中&#xff0c;可能会导致C盘空间不足&#xff0c;这时候我们可以考虑迁移游戏到其他盘。c盘游戏怎么转移到d盘&#xff1f;本指南详细讲解。 一、为什么需要将游戏移动到其他盘 现在很多游戏玩家&#xff0c…

基于结构化跨模态表示一致性的临床辅助结直肠息肉识别

文章目录 Toward Clinically Assisted Colorectal Polyp Recognition via Structured Cross-Modal Representation Consistency摘要本文方法Shared Transformer BlockCross-Modal Global AlignmentSpatial Attention Module 实验结果 Toward Clinically Assisted Colorectal Po…

Liunx下pip3换源(最详细)

在使用python时我们经常会安装各种包&#xff0c;我们一般安装的方式都是pip3 install xx模块&#xff0c;但是pip3默认源https://pypi.org/安装的过程非常慢&#xff0c;可能都是几k几k的&#xff0c;有时安装这安装着&#xff0c;直接error了&#xff0c;还有一种情况是直接飘…

BSR:Block compressed Sparse Row matrix format

BSR块压缩存储是CSR行压缩存储的升级变形&#xff1b;可以降低图数据存储空间。 有以下图的矩阵表示&#xff1a; 一、CSR表示 rowIndex [0 4 8 10 12 16 20] columns [0 1 2 3 | 0 1 2 3 | 2 3 | 2 3 | 2 3 4 5 | 2 3 4 5] values …

倒计时 1 天:Tapdata LDP V3 发布会预告,看实时数据集成平台如何赋能企业 AI 落地

更多 LDPAI 场景细节&#xff0c;敬请期待 5 月 10 日&#xff08;今天&#xff09;的 Tapdata 发布会。 最近几个月&#xff0c;AI 领域可谓经历了近十年以来最为魔幻且不可思议的时刻。 自 ChatGPT 发布以来&#xff0c;无论是底层大模型、训练框架、应用框架还是 GPT 插件等…

如何将m4v转换成mp4格式?这些方法极速无损

如何将m4v转换成mp4格式&#xff1f;众所周知&#xff0c;M4V文件格式是一个由苹果公司开发的视频文件格式&#xff0c;它通常用于iTunes Store中售卖和租赁的电影、电视节目等内容。但是&#xff0c;在某些情况下&#xff0c;我们可能无法在其他设备或软件上播放M4V文件&#…

2023年杭州助理工程师职称申报要求和申报材料是什么呢?

一、杭州助理工程师职称申报条件要求&#xff1a; 1、中专学历毕业后&#xff0c;任技术员满四年或未认定技术员参加工作满六年&#xff0c;必须参加考核&#xff0c;考试合格才能成为助理级职称资格 2、大专学历毕业后&#xff0c;三年工作经验&#xff0c;考核合格&#xf…

【AWS入门】利用CloudWatch监控EC2的CPU负载情况

创建一个 EC2 实例 User data 配置如下 #!/bin/bash sudo -i amazon-linux-extras install epel -y yum install stress -y导航到 Cloudwatch->Metrics->All metrics-EC2->Per-Instance Metrics,选中创建的 EC2的 CPU 利用率&#xff0c;点击铃铛标识创建 alarm 设…

以实战学习pandas使用方式:统计考生成绩统计及分布

以实战学习pandas使用方式&#xff1a;统计考生成绩统计及分布 引子需求逐步实现使用 pandas 读 excel初始化一些数据获取 excel 列名获取总表的统计数据分班级数据各科目比率统计统计名次分布 写入文件小结 引子 老顾日常工作&#xff0c;是用不到 python 的&#xff0c;所以…

vue-admin-template中vue动态路由不显示问题解决

使用的的是vue-admin-template&#xff0c;这是一个极简的 vue admin 管理后台&#xff0c;它只包含了 Element UI & axios & iconfont & permission control & lint&#xff0c;这些搭建后台必要的东西。需要根据自己的需求二次开发。 线上地址:vue-admin-tem…

【操作系统】进程调度

目录 调度的概念 调度目标 所有系统 批处理系统 交互式系统 实时系统 调度算法 非抢占式调度算法 先来先服务 最短作业优先 非抢占式优先级调度 抢占式调度算法 最短剩余时间优先 轮转调度 抢占式优先级调度 多级反馈队列 彩票调度 公平分享调度 调度的概念 进程是资源分配…

Windows Nvm安装

前言 在windows系统下安装的是nvm-windows&#xff0c;nvm只支持安装在在Linux和Mac系统下。之前在Linux上安装过&#xff0c;最近在Windows上安装&#xff0c;特记录一下。 下载 下载地址&#xff1a;传送门 安装 双击exe文件&#xff0c;选定安装路径&#xff0c;下一步…

在外SSH远程连接macOS服务器【cpolar内网穿透】

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

动态库和静态库的使用

一、什么是库&#xff1f; 库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码&#xff0c;相当于进行了加密&#xff0c;别人可以使用库&#xff0c;但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库…