设计模式 抽象工厂
01.人类接口
public interface Human {
//首先定义什么是人类//人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;
public void laugh(); //人类还会哭,代表痛苦
public void cry(); //人类会说话
public void talk(); //定义性别
public void sex();
}
02.接口的实现类(这里是抽象类)
因为抽象类的子类还可以扩展
AbstractYellowHuman :
public abstract class AbstractYellowHuman implements Human { public void cry() { System.out.println("黄色人类会哭");} public void laugh() { System.out.println("黄色人类会大笑,幸福呀!"); } public void talk() { System.out.println("黄色人类会说话,一般说的都是双字节"); } }
AbstractWhiteHuman :
public abstract class AbstractWhiteHuman implements Human { public void cry() { System.out.println("白色人类会哭"); } public void laugh() { System.out.println("白色人类会大笑,侵略的笑声"); }public void talk() { System.out.println("白色人类会说话,一般都是但是单字节!"); } }
AbstractBlackHuman :
public abstract class AbstractBlackHuman implements Human { public void cry() { System.out.println("黑人会哭"); } public void laugh() { System.out.println("黑人会笑"); } public void talk() { System.out.println("黑人可以说话,一般人听不懂"); } }
抽象类都实现完毕了,然后就是些抽象类的实现类了。其实,你说抽象类放这里有什么意义吗?
就是不允许你 new 出来一个抽象的对象呗
03.实现类
女性黄种人的实现类:
public class YellowFemaleHuman extends AbstractYellowHuman { public void sex() { System.out.println("该黄种人的性别为女..."); }
}
男性黄种人的实现类:
public class YellowMaleHuman extends AbstractYellowHuman { public void sex() { System.out.println("该黄种人的性别为男...."); }
}
女性白种人的实现类:
public class WhiteFemaleHuman extends AbstractWhiteHuman { public void sex() {System.out.println("该白种人的性别为女...."); }
}
男性白种人的实现类:
public class WhiteMaleHuman extends AbstractWhiteHuman { public void sex() { System.out.println("该白种人的性别为男...."); }
}
女性黑种人的实现类:
public class BlackFemaleHuman extends AbstractBlackHuman { public void sex() { System.out.println("该黑种人的性别为女..."); }
}
男性黑种人的实现类:
public class BlackMaleHuman extends AbstractBlackHuman { public void sex() { System.out.println("该黑种人的性别为男..."); }
}
04.枚举类(有实现类的class信息)
public enum HumanEnum { //把世界上所有人类型都定义出来YelloMaleHuman("com.cbf4life.yellowHuman.YellowMaleHuman"), YelloFemaleHuman("com.cbf4life.yellowHuman.YellowFemaleHuman"), WhiteFemaleHuman("com.cbf4life.whiteHuman.WhiteFemaleHuman"), WhiteMaleHuman("com.cbf4life.whiteHuman.WhiteMaleHuman"), BlackFemaleHuman("com.cbf4life.blackHuman.BlackFemaleHuman"), BlackMaleHuman("com.cbf4life.blackHuman.BlackMaleHuman"); private String value = ""; //定义构造函数,目的是Data(value)类型的相匹配private HumanEnum(String value){ this.value = value; } public String getValue(){ return this.value; } /** java enum类型尽量简单使用,尽量不要使用多态、继承等方法* 毕竟用Clas完全可以代替enum*/
}
注解:
枚举类的成员变量、方法和构造器
前面说过,枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或多个接口,也可以有自己的构造器。同时,枚举类的每个实例的成员变量的值(即对应的含义)应该是不能改变的;所以,建议将枚举类的成员变量都使用 pirvate final 修饰。那么问题又来了,所有成员变量都使用 final 修饰,则必须使用下面三种方法为成员变量指定初始值:(1)在构造器里为这些成员变量指定初始值。(2)在定义成员变量时指定默认值。(3)在初始化块中指定初始值。实际上,后面两种方式并不常用。所以,应该为枚举类显示定义带参数的构造器。一旦为枚举类显示定义了带参数的构造器,列举枚举值时就必须对应的传入参数。
public enum Gender{MALE("男"),FEMALE("女");private final String name;private Gender(String name){this.name = name;}public String getName(){return this.name;}
}
在第一行列出所有枚举值(实例)时,实际上就是调用了构造器创建枚举类对象;只是这里不需要使用 new 关键字,也无需显示调用构造器罢了。
在前面定义 SeasonEnum 时,没有传入参数,甚至没使用括号;是因为 SeasonEnum 里包含的是默认的无参构造器。
05.工厂类
接口:
public interface HumanFactory { //制造黄色人类public Human createYellowHuman(); //制造一个白色人类public Human createWhiteHuman(); //制造一个黑色人类public Human createBlackHuman(); }
抽象类:
public abstract class AbstractHumanFactory implements HumanFactory { /** 给定一个性别人类,创建一个人类出来 专业术语是产生产品等级*/protected Human createHuman(HumanEnum humanEnum) { Human human = null; //如果传递进来不是一个Enum中具体的一个Element的话,则不处理if (!humanEnum.getValue().equals("")) { try { //直接产生一个实例human = (Human) Class.forName(humanEnum.getValue()).newInstance(); } catch (Exception e) { //因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;e.printStackTrace(); } }return human; }
}
这个抽象类的目的就是减少下边实现类的代码量,我们看实现类:
实现类:
public class MaleHumanFactory extends AbstractHumanFactory { //创建一个男性黑种人public Human createBlackHuman() { return super.createHuman(HumanEnum.BlackMaleHuman); } //创建一个男性白种人public Human createWhiteHuman() { return super.createHuman(HumanEnum.WhiteMaleHuman); } //创建一个男性黄种人public Human createYellowHuman() { return super.createHuman(HumanEnum.YelloMaleHuman); }
}
public class FemaleHumanFactory extends AbstractHumanFactory {//创建一个女性黑种人public Human createBlackHuman() { return super.createHuman(HumanEnum.BlackFemaleHuman); } //创建一个女性白种人public Human createWhiteHuman() { return super.createHuman(HumanEnum.WhiteFemaleHuman); } //创建一个女性黄种人public Human createYellowHuman() { return super.createHuman(HumanEnum.YelloFemaleHuman); }
}
06.运行
public class NvWa { public static void main(String[] args) { //第一条生产线,男性生产线HumanFactory maleHumanFactory = new MaleHumanFactory(); //第二条生产线,女性生产线HumanFactory femaleHumanFactory = new FemaleHumanFactory(); //生产线建立完毕,开始生产人了:Human maleYellowHuman = maleHumanFactory.createYellowHuman(); Human femaleYellowHuman = femaleHumanFactory.createYellowHuman(); maleYellowHuman.cry(); maleYellowHuman.laugh(); femaleYellowHuman.sex(); /** .....* 后面你可以续了*/}
}
相关文章:
设计模式 抽象工厂
01.人类接口 public interface Human { //首先定义什么是人类//人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了; public void laugh(); //人类还会哭,代表痛苦 public v…...
OPTIONS请求(跨域预检查)
目录 一、什么是OPTIONS请求?二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求? OPTIONS 请求方式是 HTTP 协议中的一种,主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为…...
游戏反云手机检测方案
游戏风险环境,是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有:云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限,当游戏处于这些风险环境下,…...
HarmonyOS NEXT应用开发之动态路由
介绍 本示例将介绍如何使用动态路由跳转到模块中的页面,以及如何使用动态import的方式加载模块 使用说明 通过动态import的方式,在需要进入页面时加载对应的模块。配置动态路由,通过WrapBuilder接口,动态创建页面并跳转。动态i…...
wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载带光照信息的材质文件Mtl 实现光照贴图的最简实例(十七)
文章目录 前言一、3d 立方体 model 属性相关文件1. cube1.obj2. cube1.Mtl3. 纹理图片 cordeBouee4.jpg二、实现光照贴图的效果1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube1.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell…...
【NLP笔记】Transformer
文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接: Attention Is All You Need 参考文章: 【NLP】《Attention Is All You Need》的阅读笔记 一…...
【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息
文章目录 接上文MeshRenderer(网格渲染器)Materials(材质)Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes(探针)Ray Tracing(光线追踪)Additi…...
每日一练:LeeCode-167. 两数之和 II - 输入有序数组【双指针】
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 < numbers.…...
性能优化(CPU优化技术)-NEON指令详解
原文来自ARM SIMD 指令集:NEON 简介 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀…...
服务器硬件基础知识和云服务器的选购技巧
概述 服务器硬件基础知识涵盖了构成服务器的关键硬件组件和技术,这些组件和技术对于服务器的性能、稳定性和可用性起着至关重要的作用。其中包括中央处理器(CPU)作为服务器的计算引擎,内存(RAM)用于数据临…...
深度学习PyTorch 之 transformer-中文多分类
transformer的原理部分在前面基本已经介绍完了,接下来就是代码部分,因为transformer可以做的任务有很多,文本的分类、时序预测、NER、文本生成、翻译等,其相关代码也会有些不同,所以会分别进行介绍 但是对于不同的任务…...
STC 51单片机烧录程序遇到一直检测单片机的问题
准备工作 一,需要一个USB-TTL的下载器 ,并安装好对应的驱动程序 二、对应的下载软件,stc软件需要官方的软件(最好是最新的,个人遇到旧的下载软件出现问题) 几种出现一直检测的原因 下载软件图标…...
后端系统开发之——接口参数校验
今天难得双更,大家点个关注捧个场 原文地址:后端系统开发之——接口参数校验 - Pleasure的博客 下面是正文内容: 前言 在上一篇文章中提到了接口的开发,虽然是完成了,但还是缺少一些细节——传入参数的校验。 即用户…...
IDEA 配置阿里规范检测
IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中,右键 然后会给出一些不符合规范的修改建议: 保存代码时自动格式化代码 安装插件: 配置插件:...
数据仓库系列总结
一、数据仓库架构 1、数据仓库的概念 数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。 数据仓库通常包含多个来源的数据,这些数据按照主题进行组织和存储&#x…...
gitlab runner没有内网的访问权限应该怎么解决
如果你的GitLab Runner没有内网访问权限,但你需要访问内部资源(如私有仓库或其他服务),你可以考虑以下几种方法: VPN 或 SSH 隧道: 在允许的情况下,通过VPN或SSH隧道连接到内部网络。这将允许Gi…...
el-tree 设置默认展开指定层级
el-tree默认关闭所有选项,但是有添加或者编辑删除的情况下,需要刷新接口,此时会又要关闭所有选项; 需求:在编辑时、添加、删除 需要将该内容默认展开 <el-tree :default-expanded-keys"expandedkeys":da…...
python便民超市管理系统flask-django-nodejs-php
随着人们生活节奏的加快,以前传统的购物方式发生了巨大的改变,以前一个超市要想经营好自己的门店,每天都要忙着记账出账,尤其是出库入库统计,如果忙中出乱,可能导致今天所有的营业流水,要重新换…...
HarmonyOS — BusinessError 不能被 JSON.stringify转换
在鸿蒙中BusinessError 继承于Error,而在JavaScript(以及TypeScript,因为它是JavaScript的超集)中,Error 对象包含一些不能被 JSON.stringify 直接序列化的属性。JSON.stringify 方法会将一个JavaScript对象或者值转换…...
JupyterNotebook 如何切换使用的虚拟环境kernel
在Jupyter Notebook中,如果需要修改使用的虚拟环境Kernel: 首先,需要确保虚拟环境已经安装conda上【conda基本操作】 打开Jupyter Notebook。 在Jupyter Notebook的顶部菜单中,选择 “New” 在弹出的窗口中,列出了…...
预防GPT-3和其他复杂语言模型中的“幻觉”
标题:预防GPT-3和其他复杂语言模型中的“幻觉” 正文: “假新闻”的一个显著特征是它经常在事实正确信息的环境中呈现虚假信息,通过一种文学渗透的方式,使不真实的数据获得感知权威,这是半真半假力量令人担忧的展示。…...
从源码解析AQS
前置概念 要彻底了解AQS的底层实现就必须要了解一下线程相关的知识。 包括voliatevoliate 我们使用翻译软件翻译一下volatile,会发现它有以下几个意思:易变的;无定性的;无常性的;可能急剧波动的;不稳定的;易恶化的;易挥发的;易发散的。这也正式使用vola…...
基于Spring Boot的云上水果超市的设计与实现
摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对云上水果超市进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套云上水果超市,帮助商家进行…...
游戏引擎中的动画基础
一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战: 交互:游戏中的玩家动画需要和场景中的物体进行交互。实时:最慢需要在1/30秒内算完所有的场景渲染和动画数据。(可以用动画压缩解决&am…...
springboot3快速入门案例2024最新版
前边 springboot3 系统要求 技术&工具版本(or later)maven3.6.3 or later 3.6.3 或更高版本Tomcat10.0Servlet9.0JDK17 SpringBoot的主要目标是: 为所有 Spring 开发提供更快速、可广泛访问的入门体验。开箱即用,设置合理的…...
软考 系统架构设计师系列知识点之系统性能(1)
所属章节: 第2章. 计算机系统基础知识 第9节. 系统性能 系统性能是一个系统提供给用户的所有性能指标的集合。它既包括硬件性能(如处理器主频、存储器容量、通信带宽等)和软件性能(如上下文切换、延迟、执行时间等)&a…...
Trent-FPGA硬件设计课程
本课程涵盖FPGA硬件设计的基础概念和实践应用。学生将学习Verilog语言编程、数字电路设计原理、FPGA架构和开发工具的使用。通过项目实践,掌握FPGA设计流程和调试技巧,为硬件加速和嵌入式系统开发打下坚实基础。 课程大小:4.3G 课程下载&am…...
【大模型学习记录】db-gpt源码安装问题汇总
1、首次源码安装时安装的其实dbgpt到conda环境中,会将路径一起安装。 如果有其他的路径使用同样的conda环境会报错,一直读取的就是原先的路径的内容。需要自己新创建一个conda env 2、界面中配置知识库问答时,报错 # 1、报的错如下&#x…...
QB PHP 多语言配置
1: 下载QBfast .exe 的文件 2: 安装的时候 ,一定点击 仅为我 安装 而不是 所有人 3: 如果提示 更新就 更新 , 安装如2 4: 如果遇到 新增 或者编辑已经 配置的项目时 不起作用 : 右…...
Kubernetes实战(三十一)-使用开源CEPH作为后端StorageClass
1 引言 K8S在1.13版本开始支持使用Ceph作为StorageClass。其中云原生存储Rook和开源Ceph应用都非常广泛。本文主要介绍K8S如何对接开源Ceph使用RBD卷。 K8S对接Ceph的技术栈如下图所示。K8S主要通过容器存储接口CSI和Ceph进行交互。 Ceph官方文档:Block Devices a…...
青岛网站建设在线/厦门网站优化公司
1.wait() 函数,waitpid函数() 头文件:#include <sys/types.h> #include <sys/wait.h> 函数原型:pid_t wait(int *statloc); pid_t waitpid(pid_t pid,int *statloc,int options); 函数说明:wait函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回…...
云南网站建设公司前十名/东莞网站推广优化公司
属于node的第三方模块,在与代码同级的文件夹下,按住shift,鼠标右键打开power shell窗口,使用 npm install express 命令,进行下载基于Node平台的web应用开发框架 // 引入express框架 const express require(express)…...
北京办理广播电视节目制作经营证/杭州seo靠谱
简介Java虚拟机通过装载、连接和初始化一个类型,使该类型可以被正在运行的Java程序使用。装载:把二进制形式的Java类型读入Java虚拟机中。连接:把装载的二进制形式的类型数据合并到虚拟机的运行时状态中去。验证:确保Java类型数据…...
wordpress源码类主题/搜索引擎有哪些平台
参考:https://www.cnblogs.com/xianfengzhike/p/9939029.html...
阳江seo优化/seo合作代理
触发器:触发器的使用场景以及相应版本:触发器可以使用的MySQL版本:版本:MySQL5以上使用场景例子:每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写每当订购一…...
扁平网站 文案/公司品牌宣传
1.最典型的就是找爬虫外包活儿 网络爬虫最通常的的挣钱方式通过外包网站,做中小规模的爬虫项目,向甲方提供数据抓取,数据结构化,数据清洗等服务。新入行的程序员大多都会先尝试这个方向,直接靠技术手段挣钱࿰…...