java 工厂方法模式_Java中的工厂方法模式

java 工厂方法模式

在上一篇有关模板方法模式的文章中 ,我展示了如何利用lambda表达式和默认方法 。 在本文中,我将探讨工厂方法模式,并了解如何利用方法引用,这是Java 8中与lambda表达式一起添加的另一项功能。

让我们考虑一个Vehicle接口及其两个实现,即CarVehicle

interface Vehicle{public void drive();public void clean();
}
class Car implements Vehicle{@Overridepublic void drive(){System.out.println("Driving a car...");}@Overridepublic void clean(){System.out.println("Cleaning a car...");}
}
class Bus implements Vehicle{@Overridepublic void drive(){System.out.println("Driving a Bus...");}@Overridepublic void clean(){System.out.println("Cleaning a Bus...");}
}

为了drive()clean() Vehicle我们将使用VehicleDriver

Java 7及更低版本中的实现

让我们从Java 8之前的版本(即Java 7和更低版本)的角度考虑VehicleDriver的实现和实现。

abstract class VehicleDriver{public abstract Vehicle getVehicle();public void driveVehicle(){getVehicle().drive();}public void cleanVehicle(){getVehicle().clean();}
}
class CarDriver extends VehicleDriver{@Overridepublic Vehicle getVehicle(){return new Car();}
}class BusDriver extends VehicleDriver{@Overridepublic Vehicle getVehicle(){return new Bus();}
}

在上述VehicleDriver实现中, getVehicle()方法是工厂方法,被CarDriverBusdriver覆盖以分别返回CarBus实例。 这样,程序员将更加关注使用VehicleDriver抽象,而不必关注其不同的实现。 还有另一种相关的模式: 工厂模式 ,它与该模式略有不同,读者不应将其与该模式混淆。 好的,让我们快速看一下如何使用它,然后再进行其Java 8变体:

public class FactoryMethodPattern {public static void main(String[] args) {handleVehicle(new CarDriver());handleVehicle(new BusDriver());}static void handleVehicle(VehicleDriver2 vDriver){System.out.println("Handling a new vehicle. Pre lambda way");vDriver.driveVehicle();vDriver.cleanVehicle();}
}

输出为:

Handling a new vehicle. Pre lambda way
Driving a car...
Cleaning a car...
Handling a new vehicle. Pre lambda way
Driving a Bus...
Cleaning a Bus...

利用Java 8

首先,我们不需要抽象的VehicleDriver及其2种不同的实现。 取而代之的是,我们使用带有 VehicleDriver 接口的方法来创建VehicleDriver抽象,如下所示:

interface VehicleDriver{public Vehicle getVehicle();public default void driveVehicle(){getVehicle().drive();}public default void cleanVehicle(){getVehicle().clean();}   
}

现在来看有趣的部分-使用方法引用,而不是创建VehicleDriver不同实现。 这些方法引用为代码提供了一种获取所需的CarBus类实例的方法,而无需陷入重写getVehicle()方法的麻烦。 困惑? 好奇? 让我们看看如何实现这一目标:

public class FactoryMethodPatternLambda {public static void main(String[] args) {handleVehicle(Car::new);handleVehicle(Bus::new);}static void handleVehicle(VehicleDriver vDriver){System.out.println("Handling a new vehicle...");vDriver.driveVehicle();vDriver.cleanVehicle();}
}

输出为:

Handling a new vehicle...
Driving a car...
Cleaning a car...
Handling a new vehicle...
Driving a Bus...
Cleaning a Bus...

我们只提供了一个Vehicle来处理handleVehicle方法,而不用担心它是如何被处理或由谁来处理的。 但是在Java 7中以及在实现之前,我们必须意识到有一些VehicleDriver抽象类,然后我们必须重写其某些方法,然后创建该扩展类的实例。 通过显示此示例,我的主要目的是可以利用Java 8功能来创建更简洁易用的API。 但是,随着所有新功能的出现,学习曲线也随之增加。

注意:在上述两种实现中,共同的部分是VehicleCarBus类,它们由Java 7和Java 8实现使用。

参考: JCG合作伙伴 Mohamed Sanaulla在Javas中的Factory Method模式,来自Experiences Unlimited博客。

翻译自: https://www.javacodegeeks.com/2013/05/factory-method-pattern-in-java.html

java 工厂方法模式

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

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

相关文章

几种常见的集成触发器(D、T、JK)

同步RS触发器存在“空翻”现象,即触发器存在多次翻转的现象,空翻破坏了“时序电路按时钟节拍工作,每个时钟脉冲作用下电路的状态只发生一次转换”的基本原则 解决方法:将电平触发改为边沿触发,使得触发器旨在时钟脉冲…

mysql md5版本校验_MySQL查询以名称的md5版本更新所有条目?

为此,您可以使用MD5()。让我们首先创建一个表-mysql> create table DemoTable1887(Password text,HashPassword text);使用插入命令在表中插入一些记录-mysql> insert into DemoTable1887(Password) values(John9089);mysql> insert into DemoTable1887(Pa…

Hashcat从入门到入土(一)

Hashcat的官方是这么介绍自己的 Hashcat is a password recovery tool. It had a proprietary code base until 2015, but was then released as open source software. Versions are available for Linux, OS X, and Windows. Examples of hashcat-supported hashing algorith…

MySQL在哪里看secret_key_K8S 创建和查看secret(九)

yaml中的用户密码敏感信息一般都会采用密码存储采用base64编码进行加密[roothz-95 pv]# echo -n guang | base64emd1YW5nag[roothz-95 pv]# echo -n 1q2w#E$R | base64cat secret.ymalapiVersion: v1kind: Secretmetadata:name: mysecret2data:username: emd1YW5nagpassword: M…

java 语义_Java文件合并变得语义化

java 语义与任何程序员交谈,并询问他应该如何进行合并:“它应该理解代码,对其进行解析,然后根据结构进行合并” –他很可能会说。 而这恰恰是SemanticMerge for Java所做的:它解析要合并的文件(加上祖先或…

python循环指令_Python循环

布尔运算学习循环之前,先了解一个概念:布尔运算布尔运算是数字符号化的逻辑推演法,包括联合、相交、相减。在图形处理操作中引用了这种逻辑运算方法以使简单的基本图形组合产生新的形体,并由二维布尔运算发展到三维图形的布尔运算…

Apache Pulsar:分布式发布订阅消息系统

Apache Pulsar是一个开源的分布式pub-sub消息传递系统,最初由Yahoo创建,并且是Apache Software Foundation的一部分 。 Pulsar是用于服务器到服务器消息传递的多租户高性能解决方案。 脉冲星的主要功能包括[4]: 对Pulsar实例中的多个集群的…

查看mysql进程ps_linux ps命令查看当前运行的进程

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想对进程进行实时的监控,应该用 top 命令。要对进程进行监测和控制&#xff0…

java获取文件编码_java如何获取文件编码格式

1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三…

java上传文件功能_Java MemoryMapped文件的功能

java上传文件功能Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取。 内存映射文件可用于开发IPC类型的解决方案。 本文是使用内存映射文件创建IPC的实验。 有关内存…

java代码快速_java代码编写快捷途经

CtrlR 然后按下R键SHiftAltR:对选定属性进行全局命名CtrlD:删除当前行CtrlQ: 定位到最后编辑的地方CtrlL: 定位在某行CtrlM: 最大化当前的 Edit(命令)CtrlO:快速显示大纲CtrlD:显示继承结构CtrlW :关掉当…

控制Java并行流的并行度

在掌握了这些新功能之后,随着Java 9的最新发布,我们有了许多新功能可以用来改进我们的解决方案。 Java 9的发布也是修改我们是否掌握Java 8功能的好时机。 在本文中,我想解决关于Java并行流的最常见的误解。 人们通常说您不能以编程方式控制…

java小型超市系统_Java小型超市收银系统

【实例简介】Java SE开发的超市收银系统,实现了数据库操作,文件读取数据,写入数据等操作【实例截图】【核心代码】超市收银系统└── 期末综合├── bin│ ├── Driver.class│ ├── control│ │ ├── ExportMenuController…

double取值范围 java_Java中float/double取值范围与精度

Java浮点数浮点数结构要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西&#…

开源点云数据处理 开源_大数据开源安全

开源点云数据处理 开源在安全性方面从未有(恕我直言)已经足够了开源解决方案和布鲁斯已经撰写了有关这几个 时间在过去 ,而且也没有必要再次改写参数。 现在,随着市场上“ NoSQL”和“大数据”开源趋势的发展,安全终于…

为您的Web应用程序启用两因素身份验证

支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统。 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 。 启用它们需要类似的流程: 用户转到其个人资料页面(如果要在注…

redis java序列化_java处理redis的几种序列化策略

简单记录一下java处理redis的几种序列化策略,这里使用的环境是springboot 2.0.4springboot中提供了StringRedisTemplate和RedisTemplate两种序列化类,它们都只能读自己存的数据,即数据互不相通。主要区别如下:1、采用的序列化策略…

java 访问内部类的属性_java中的内部类详细总结

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,此处不能单方…

迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中

服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端。 这是我们的网络浏览器支持的年龄,但令人惊讶的是, JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jersey提供了适用于…

java 面向对象继承的思想_Java面向对象思想

Java类的定义:成员变量会默认初始化,局部变量不会默认初始化。如何在内存中区分类和对象:♦类是静态的概念,代码区♦对象是new出来的,位于堆内存,类的每一个成员变量在不同的对象中都有不同的值(除了静态变…