设计模式 抽象工厂

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(); /** .....* 后面你可以续了*/} 
} 

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

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

相关文章

极客SaaS框架开源包

可以自备 听说后边要出saas去水印小程序 saas短视频去重小程序

Java数据结构-二分查找学习

文章目录 前言一、通常情况下的两种二分查找的形式1.经典款2.左闭右开款 二、做题题解中的二分查找的变形1.有效的完全平方数(LeetCode367) 前言 因为最近刷到二分查找的题目学习到了不同的写法,因此在这里总结一下,方便之后遗忘…

数据结构和算法模块——队列(多例子+图文)

一文帮你看懂队列 什么是线性表为什么要学习线性表,它有什么用处和好处?基本概念分类存储结构结构特点 队列为什么要学习队列?基本概念数据结构基本操作 待填坑 什么是线性表 为什么要学习线性表,它有什么用处和好处?…

docker入门(三)—— 安装docker

docker 安装 环境要求 本次使用的是云服务器,版本是 centos,要求版本在3.10以上 [rootiZbp15293q8kgzhur7n6kvZ /]# uname -r 3.10.0-1160.108.1.el7.x86_64 [rootiZbp15293q8kgzhur7n6kvZ /]# cat /etc/os-release NAME"CentOS Linux" VE…

操作系统核心知识点大梳理

计算机结构 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去…

Linux环境变量【终】

🌎环境变量 文章目录: 环境变量 环境变量的组织方式 创建自己的环境变量       main函数参数       C语言提供的变量与接口 环境变量与本地变量 了解本地变量       取消本地变量和环境变量 环境变量的出处 总结 前言: 上…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Spring学习记录之依赖注入

问题1: 往一个类中传递数据的方式有哪些呢,其实,只有一种方式,即通过方法,但方法却有多种,一种是我们先前学到的通过set方法(普通方法),另一种则是通过构造方法的方式。…

【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于GHS推出的最新编译器版本 Compiler 2023.5.4在GHS以前版本的MULTI IDE上面能否使用的问题 2、 问题场景 针对于,客户使用MULTI IDE 8.1.4以前的IDE版本,想要搭载使用最新版本的编译器…

c++ 模拟 三维数组输入 string转化为int

// 函数用于将字符串解析为三维数组 vector<vector<vector<int>>> parseString3(string& input) { //[[[0,1,0,0,2],[1,2,1,2,1],[1,0,1,0,0],[0,1,2,0,0],[1,1,0,0,2]]] vector<vector<vector<int>>> result1; vector<…

Python爬虫-数据采集和处理

文章目录 数据数据类型 数据分析过程数据采集数据采集源数据采集方法 数据清洗清洗数据数据集成数据转换数据脱敏 数据 《春秋左传集解》云&#xff1a;“事大大其绳&#xff0c;事小小其绳。”体现了早期人类将事情的“大小”这一性质抽象到“绳结大小”这一符号上从而产生数…

(保姆级)离线安装mongoDB集群

Docker搭建MongoDB集群 副本集模式&#xff08;Replica Set&#xff09; 是一种互为主从的关系&#xff0c; Replica Set 将数据复制多份保存&#xff0c;不同服务器保存同一份数据&#xff0c;在出现故障时自动切换&#xff0c;实现故障转移。 此集群拥有一个主节点和多个从…

【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录 0. 前言1. 基本用法1.1 转换为Tensor1.2 图像大小调整1.3 随机裁剪1.4 中心裁剪1.5 随机翻转1.6 随机旋转1.7 填充1.8 组合变换 2. 进阶用法2.1 归一化2.2 色彩空间转换2.3 颜色抖动2.4 随机仿射2.5 透视变换2.6 自定义变换 0. 前言 按照国际惯例&#xff0c;首先声明…

Spring Data访问Elasticsearch----路由值Routing values

Spring Data访问Elasticsearch----路由值Routing values 一、join-types的路由二、自定义路由值 当Elasticsearch将文档存储在具有多个分片的索引中时&#xff0c;它会根据文档的id确定要使用的分片。有时有必要预先定义多个文档应该在同一个shard上建立索引&#xff08;join-t…

Day51-Nginx多实例知识与大厂企业级实战

Day51-Nginx多实例知识与大厂企业级实战 1. 什么是nginx多实例&#xff1f;2. 为什么要用多实例&#xff1f;3. 大厂数百个业务项目&#xff0c;如何来管理&#xff1f;4. 大厂上百项目web分用户解决方案4.1 编译nginx环境实践&#xff1a;4.2 zuma实例(利用普通用户权限将不同…

LeetCode题练习与总结:组合总和Ⅱ

一、题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 二、解题思路 排序&#xff1a…

前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】

目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一&#xff1a;进入阿里矢量库官网中&#xff1a;iconfont-阿里巴巴矢量…

教务管理系统(java+mysql+jdbc+Druid+三层架构)

1、项目要求 1.1数据库表描述 设计一个教务管理系统&#xff0c;要求如下&#xff1a; 系统涉及的表有 account表&#xff08;账号表&#xff09; teacher表&#xff08;教师表&#xff09; student表&#xff08;学生表&#xff09; course表 (课程表) score表&#xff08;成…

拦截器(springboot)

1、拦截器介绍 在SpringBoot中&#xff0c;拦截器是一种用于拦截请求并在处理请求之前或之后执行特定操作的机制。 拦截器可以用于实现一些通用的功能&#xff0c;例如身份验证、日志记录、性能监控等。 Springboot中的拦截器是通过实现HandlerInterceptor接口来实现的&#x…

[Halcon学习笔记]机器视觉缺陷检测常用方法对比总结

1、介绍 缺陷检测时机器视觉需求中最复杂难度较大的一类需求。究其原因&#xff0c;主要是在项目开发过程中首先要保证检测的稳定性和精度&#xff0c;又要实现缺陷检测的通用性&#xff0c;常见的缺陷&#xff1a;凹凸、污点瑕疵、划痕、裂缝、伤痕、毛刺等等类型种类繁杂&am…