构造器模式

news2024/10/7 2:17:58

构造器模式

  1. 意图
    • 将一个复杂对象的构建和表示分离,使得相同的构建能创建不同的表示。
  2. 解释
    案例:想象一个角色扮演游戏的特征生成器。最简单的选择是让计算机为你创建角色。如果你想手动选择特征的细节像职业、性别、头发的颜色等。特征的产生是一个循序渐进的过程,当所有选择都就绪时结束。
    简单说:允许你在避免函数污染的情况下创建不同特征的对象。当一个对象有好几种特征时或当创建对象需要很多步骤时。
  3. 样例
    //盔甲
    public enum Armor {
        CHAIN_MAIL("Chain Mail"),
        CLOTHES("Clothes"),
        LEATHER("leather"),
        PLATE("plate");
    
        private String description;
    
        Armor(String description) {
            this.description = description;
        }
    
        public String getDescription() {
            return description;
        }
    }
    
    //头发的颜色
    public enum HairColor {
        BLACK,
        BLOND,
        BROWN,
        RED,
        WHITE;
    }
    
    //头发类型
    public enum HairType {
        BALD("bald"),
        CURLY("curly"),
        LONG_CURLY("long curly"),
        LONG_STRAIGHT("long straight"),
        SHORT("short");
    
        private String description;
    
    
        HairType(String description) {
            this.description = description;
        }
    }
    
    //职业
    public enum Profession {
        MAGE,
        PRIEST,
        THIEF,
        WARRIOR;
    }
    
    //武器
    public enum Weapon {
        AXE,
        BOW,
        DAGGER,
        SWORD,
        WARHAMMER;
    
    }
    
    //角色
    public final class Hero {
        private Armor armor;
        private Weapon weapon;
        private HairType hairType;
        private HairColor hairColor;
        private Profession profession;
    
        public Hero(Builder builder){
            this.armor = builder.armor;
            this.weapon = builder.weapon;
            this.hairType = builder.hairType;
            this.hairColor = builder.hairColor;
            this.profession = builder.profession;
        }
    
        public Armor getArmor() {
            return armor;
        }
    
        public Weapon getWeapon() {
            return weapon;
        }
    
        public HairType getHairType() {
            return hairType;
        }
    
        public HairColor getHairColor() {
            return hairColor;
        }
    
        public Profession getProfession() {
            return profession;
        }
    
        public static class Builder {
            private Armor armor;
            private HairType hairType;
            private HairColor hairColor;
            private Profession profession;
            private Weapon weapon;
            private String name;
    
            public Builder(Profession profession, String name) {
                this.profession = profession;
                this.name = name;
            }
    
            public Hero build() {
                return new Hero(this);
            }
    
            Builder withArmor(Armor armor) {
                this.armor = armor;
                return this;
            }
    
            Builder withHairType(HairType hairType) {
                this.hairType = hairType;
                return this;
            }
    
            Builder withHairColor(HairColor hairColor) {
                this.hairColor = hairColor;
                return this;
            }
    
            Builder withWeapon(Weapon weapon) {
                this.weapon = weapon;
                return this;
            }
        }
    
    }
    
    public class Main {
        public static void main(String[] args) {
            var riobard = new Hero.Builder(Profession.MAGE, "Riobard").
                    withHairColor(HairColor.BLACK).
                    withWeapon(Weapon.DAGGER)
                    .build();
            
        }
    }
    
  4. 结构图

在这里插入图片描述

  1. 适用性

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

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

相关文章

基于java与vue的生鲜物流系统的设计与实现-计算机毕业设计源码13339

摘要 生鲜产品易于腐烂、难贮存、不易长时间运输,生产者所面临的市场风险很大,很多生鲜产品无法实现“货畅其流”和“物尽其值”,适宜的生鲜产品物流体系就显得尤为重要。本文将广东省生鲜产品物流体系的构建作为一个例子进行系统研究。首先对…

Stable Diffusion 笔记一:网络结构拆解

SD由三大组件组成:VAE,CLIP,Unet。 一VAE: VAE是Variational Autoencoder的缩写,中文名变分自编码器,是一种基于深度学习的生成模型。 1潜空间图片与像素图片: 像素图片是正常使…

(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

前言 在上一节内容中,我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler,正常情况下其可以处理我们系统的运行时异常,但是无法处理参数验证的异常WebExchangeBindException,所以这里提供另外…

Amazon CodeWhisperer 代码提示——Golang 测评

前言 官网链接: 亚马逊云科技 Amazon CodeGuru Reviewer 中的 CodeWhisperer 是一种代码提示工具,它使用机器学习和人工智能技术来提高开发人员的代码质量和效率。它可以通过分析代码库中的历史代码和最佳实践,为开发人员提供有关如何改进其…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一:方法二:展示效果:需要包依赖:代码: 方法三:展示效果:需要包依赖:代码:自己调参数,选择符合自己的 vue预览pdf集中方法 我…

selenium-Web界面搜索功能测试

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨 测试环境准备: 1、安装Python 2、安装Ch…

C++面试宝典第25题:阶乘末尾零的个数

题目 给定一个整数n,返回n!(n的阶乘)结果尾数中零的个数。 示例 1: 输入:3 输出:0 解释:3! = 6,尾数中没有零。 示例 2: 输入:5 输出:1 解释:5! = 120,尾数中有1个零。 解析 这道题主要考察应聘者对于数学问题的分析和理解能力,以及在多个解决方案中,寻求最优…

Python 拼接字符串的 7 种方式

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。 几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来…

Github 2024-01-28 开源项目日报Top10

根据Github Trendings的统计,今日(2024-01-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目2Rust项目1HTML项目1JavaScript项目1Cuda项目1C#项目1非开发语言项目1 Nuxt&#…

Spring Boot通过配置文件支持数据库自定义表名

直接上干货: 例如一个叫xxx的项目,yml文件里加上这段 xxxproject:db:xxxTable: xxx_dbname #自定义的数据库表名创一个Configuration类放表名和Mapper // XxxProjectAutoConfiguration.javaConfiguration MapperScan(basePackages "cn.com.xxxp…

蓝牙----蓝牙连接建立_连接建立

蓝牙----蓝牙连接建立_连接建立 蓝牙连接建立过程图1.主机扫描到广播包1.1判断是否是自己关心的广播包1.2广播地址添加到扫描列表 2.主机扫描结束,建立连接3.主从连接成功后,执行连接建立后事件3.1.主机将连接句柄和设备地址添加到连接列表3.2.主机进行G…

ad18学习笔记十六:v割

所谓“V割”是印刷电路板(PCB)厂商依据客户的图纸要求,事先在PCB的特定位置用转盘刀具切割好的一条条分割线,其目的是为了方便后续SMT电路板组装完成后的分板之用,因为其切割后的外型看起来就像个英文的“V”字型&…

msfconsole实战使用(结合靶场演示)

msfconsole实战使用 前言 MSFconsole(Metasploit Framework Console)是Metasploit框架的一部分,是一个功能强大的渗透测试工具。Metasploit框架是一个开源的安全工具,旨在开发、测试和执行针对计算机系统的攻击。MSFconsole是Me…

SpringMvc切换Json转换工具

SpringBoot切换使用goolge的Gson作为SpringMvc的Json转换工具 <!-- gson依赖 --> <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> </dependency>Configuration public class JsonWebConfig {B…

ThreadLocal学习笔记

ThreadLocal类图 ThreadLocal/InheritableThreadLocal/ \TransmittableThreadLocal(阿里巴巴) TransmissibleThreadLocal(阿里巴巴)ThreadLocal 这是Thread类的局部变量&#xff0c;每个线程私有。 它主要用于解决多线程中的数据共享问题&#xff0c;保…

把数组中的key都取出来然后去重

今日接到一个小需求&#xff0c;一张表有类似这样的数据&#xff1a;&#xff08;下面是一行&#xff09; 但是每行的数据&#xff0c;主要是key不一样&#xff0c;我们想把所有的key取出来&#xff0c;并且做个去重。 首先我先在mysql中&#xff0c; SELECT GROUP_CONCAT(RE…

在租户内启用SharePoint Embedded

要开启 SharePoint Embedded&#xff0c;你得是管理员&#xff0c;然后按照这些步骤操作&#xff1a; 登录到你的 SharePoint 管理中心。在左边的菜单里找到“设置”选项&#xff0c;点进去。 3. 在设置页面里找到“SharePoint Embedded 应用”。 4.如果这个功能还没开启&…

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧&#xff0c;K8s现在主流&#xff0c;应用最广的容器集群管理技术。 k8s全称kubernetes&#xff08;首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s&#xff0c;所以简称 k8s&#xff09;&#xff0c;基于Docker容器…

Top-level await is not available in the configured target environment

当在使用 Vite 进行项目构建时&#xff0c;可能会遇到如下错误提示&#xff1a;ERROR: Top-level await is not available in the configured target environment。 问题原因 这个错误通常是由于项目配置中的目标浏览器环境不支持 JavaScript 的 top-level-await 特性。top-le…

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序&#xff0c;尤其大中型的项目来说&#xff0c;在程序启动和运行时&#xff0c;往往需要传入许多参数来控制程序的行为&#xff0c;我们可以通过命令行参数&#xff0c;环境变量&#xff0c;配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…