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及其两个不同的实现。 相反,我们使用带有Default方法的接口来创建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

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

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

相关文章

会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架

分享代码基地会员中心的PHP签到系统,PHP很漂亮的签到界面。签到后,会有不同颜色区分。附带PHP签到源码带安装说明和详细注释。(详细查看https://www.daimajidi.com/deal/574)JS:function getUrl(strs) {var url "/demo/1563064903/" strs;re…

MVP数据请求recycview展示

M层 public class Mod {public void shuju(final Modlister modlister){ OkHttpClient okHttpClientnew OkHttpClient();final Request requestnew Request.Builder().url("http://v.juhe.cn/weixin/query?key55010ae808217e996bbf414bbdad843c").build(); Call …

impress.js

介绍一下 impress.js是一个非常炫酷的幻灯片展示框架,依靠CSS3技术。 impress.js使用起来非常简单,下面就来简单介绍一下其用法。 Start 首先,当然要引入impress.js。 在div标签设置id为impress(不要求一定是div)…

Spring MVC:表单处理卷。 1个

Spring MVC是Spring Framework的一部分,其主要目的是使Web开发更加简单,便捷和轻松。 与表单的交互是或多或少现代Web应用程序的一部分。 Spring MVC允许您以非常严格和简单的方式执行各种形式的活动。 在本文中,您将在Spring MVC的帮助下阅读…

用php打出前一天的时间格式,[php]用PHP打印出前一天的时间格式

echo date("Y-m-d H:i:s",strtotime("-1 day"));例子echo(strtotime("now"));echo(strtotime("3 October 2005"));echo(strtotime("5 hours"));echo(strtotime("1 week"));echo(strtotime("1 week 3 days 7 …

《Python学习之路 -- 字符串的方法》

在前面已经提到Python中的字符串了,本文来列举介绍字符串的方法,我将字符串的方法分为以下几类: ①查询方法 str.find(target,startNone,endNone) 该方法用于查询字符串str中是否含有target,如果有,则返回target在这个…

Java监视器绑定的超人

这是超人生活中的黑暗时期。 乔尔艾尔(Jor-El)希望他继续航行,为他的最终命运做好准备。 然而,地球面临着世界末日,正义联盟需要他们的钢铁侠行动来拯救世界。 但是由于我们只有一个超人,您不能同时做这两个…

C语言第一次实验报告

一.实验题目,设计思路,实现方法 第四次 计算分段函数和循环NEW 4-3 求N分之一序列前N项和 4-6 输出华氏-摄氏温度转换表 第四次 分支循环 加强版 4-2-7 装睡 设计思路:4-3开始需要计算大量式子,因此利用到相对便捷的…

php充值卡,ecshop 充值卡功能_懒人程序

/*显示页面的action列表*/$ui_arrarray(register,login,profile,... 增加cz然后在下面代码处加入if ($actioncz)//冲值{ if($_GET[a]add){ if (empty($_SESSION[user_id])){ show_message(该用户不存在。,返回上一页,user.php?actcz);} else{ $kstrtoupper(substr($_POST[k],0…

CSS实现垂直居中的5种方法

利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法。我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站。 使用 CSS 实现垂直居中并不容易。有些方法在一些浏览器中无效。下面我们看一下使对象垂直集中的5种不同方法&#xf…

尝试使用jBPM Console NG(测试版)

大家好! 这是关于jBPM Console NG的另一篇文章。 经过6个月的辛苦工作,我很高兴为开发者社区撰写这篇文章,以进行尝试。 在这篇文章中,我将解释如何从源代码构建应用程序。 这背后的主要思想是知道如何在测试过程中设置环境并修改…

三个实用的提升网页性能技巧

1、display属性设置 先将元素设为 display: none(需要1次重排和重绘),然后对这个节点进行100次操作,最后再恢复显示(需要1次重排和重绘)。这样一来,你就用两次重新渲染,取代了可能高…

mysq在某一刻同时获取主从库的位置点

在从库进行锁表操作flush table with read lock, 通过show slave status\G 获取对应主库的位置点: show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host…

php在window磁盘管理,Windows Server 2008R2设置磁盘阵列

RAID(独立硬盘冗余阵列)指用多个硬盘组成一个高性能、大容量的一个硬盘组合。独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(RedundantArray of Inexpensive Disks),简称硬盘阵列。其基本思想就是把多个相对便宜的…

解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错

新项目开发需要安装依赖,但是安装完之后通过gulp运行项目,产生了一下的报错: 解决方案是执行一些方法: npm rebuild node-sass可是有时就是网络问题导致上面命令安装失败,查下失败提示,有可能是&#xff1a…

没有应用程序服务器

我们最近发布了有关从免费Plumbr部署中收集的应用服务器市场份额的数据 。 它产生了很好的共鸣-通过不同的渠道,我们获得了数百种有关如何解释数据的评论。 但是,通过各种渠道不断提出一种形式不同的论点。 无论是采用“ T omcat不是应用程序服务器 ”的…

HTML基础知识(未完待续)

一、HTML编辑工具&#xff1a;Sublime Text 二、HTML实体字符&#xff1a;1、&#xff08; 空格&#xff09;&#xff1a;&nbsp&#xff1b; 2、&#xff08;<&#xff09; &lt&#xff1b; 3、&#xff08;>&#xff09;&gt&#xff1b; 4、&#xff08;&a…

系统讲解CSS,前端开发最神奇的技术,新手的你一定不能错过

前面小编带领大家重温了前端开发中最基本的HTML语言。如果你已经掌握了这门语言&#xff0c;那么恭喜你&#xff0c;可以去深入了解CSS技术了。CSS技术最主要的功能就是弥补HTML标记对在页面中显示外观的不足&#xff0c;对这些标记对的默认外观进行美化。从本文开始&#xff0…

java 自定义对象 排序,使用自定义排序顺序对对象的ArrayList进行排序

问题我希望为我的地址簿应用程序实现一个排序功能。我想排序anArrayList contactArray.Contact是一个包含四个字段的类&#xff1a;名称&#xff0c;家庭电话号码&#xff0c;手机号码和地址。我想排序name。如何编写自定义排序功能来执行此操作&#xff1f;#1 热门回答(255 赞…

JUnit和Mockito合作

这次&#xff0c;我想对测试框架Mockito进行概述。 毫无疑问&#xff0c;这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 用Mockito准备测试 通常&a…