博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 8 中的工厂方法模式
阅读量:6440 次
发布时间:2019-06-23

本文共 2378 字,大约阅读时间需要 7 分钟。

  hot3.png

先唠叨一句工厂方法模式的定义:

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

示例

先举一个汽车的栗子

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

Java 7 及其之前版本的工厂方法

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

在使用时

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(); }}

Java 8 中的工厂方法

在 Java 8 中,我们可以通过 Lambda 来简化工厂方法的实现

interface VehicleDriver { public Vehicle getVehicle(); public default void driveVehicle() { getVehicle().drive(); } public default void cleanVehicle() { getVehicle().clean(); }}public class FactoryMethodPatternLambda { public static void main(String[] args) { handleVehicle(Car::new); // Method reference handleVehicle(() -> new Bus()); // Closure } static void handleVehicle(VehicleDriver vDriver) { System.out.println("Handling a new vehicle..."); vDriver.driveVehicle(); vDriver.cleanVehicle(); }}

方法接口

在 Java 8 中引入了方法接口这个概念,其定义是只包含一个方法定义的接口(新引入的默认方法不算,因为它算是方法实现)。在本例中,VehicleDriver 就是一个方法接口。在 Java 8 中可以通过使用闭包和方法引用的方式简化对方法接口的使用。

使用闭包时,闭包就会自动作为方法接口中唯一的方法定义的实现。使用方法引用时,方法引用则会被调用,其返回值被作为方法接口中的方法定义的返回值。

方法引用与闭包

相比较方法引用和闭包,我更倾向于后者,因为其语法更为清晰易懂,也容易扩展。因为很多时候你不只是需要 new 一个新对象,还需要做很多别的事情。这时,使用闭包就变得很容易实现这个目的了。

转载于:https://my.oschina.net/lifany/blog/135057

你可能感兴趣的文章
排序算法(一)——冒泡排序及改进
查看>>
Ext江湖
查看>>
一起谈.NET技术,实战ASP.NET大规模网站架构:Web加速器
查看>>
RHEL 6.6下Python 2.6.6升级到Python 3.6.6
查看>>
linux 内核启动过程以及挂载android 根文件系统的过程 ( 转)
查看>>
shell每日更新(7)
查看>>
单词的个数
查看>>
从程序员到项目经理(27):怎样给领导汇报工作
查看>>
eclipse工程 'cocostudio/CocoStudio.h' file not found
查看>>
045医疗项目-模块四:采购单模块—采购单提交(Dao,Service,Action三层)
查看>>
dockerfile创建php容器(安装memcached、redis、gd、xdebug扩展)
查看>>
转:面对JXTA,我迷茫了
查看>>
IT人必须学会的职场四原则
查看>>
Android之剪贴薄实现
查看>>
Sonix SN9P701 OCR点读笔二维码识别源码
查看>>
oracle 单引号 双引号 连接符
查看>>
如何使用fileupload工具来实现文件上传
查看>>
EZ GUI Button和Checkbox创建
查看>>
指针[收藏]
查看>>
审批流程设计方案-介绍(一)
查看>>