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 工厂方法模式

java 工厂方法模式_Java中的工厂方法模式相关推荐

  1. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  2. java中函数和方法区别_java中函数和方法的区别是什么?

    java中函数和方法的区别是什么? 面向对象的语言叫方法 面向过程的语言叫函数 在java中没有函数这么一说,只有方法一说.实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已. [推荐教 ...

  3. java valueof的用法_Java中String.valueOf()方法的使用

    Java中String.valueOf()方法的使用 (2013-06-21 18:07:34) 标签: it Java中String.valueOf() 方法的使用 1. 由 基本数据型态转换成 S ...

  4. java 职责链模式_Java中的责任链模式

    java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...

  5. java关于创建对象描述_java中创建对象的方法

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

  6. java 什么是哨兵_Java中使用redis哨兵模式

    Redis概述 在传统的软件项目中,使用数据库进行数据存储,但是有一些致命的缺陷,这些缺陷反映在性能方面.由于数据库存储数据的介质是磁盘,而磁盘读写的速度比较慢.在不存在大量高并发的应用场景中,这个缺 ...

  7. java 方法互斥_Java中的互斥方法执行

    检查底部的更新 – 我不认为这种方法可行.留下它作为信息. >如果某个线程在b()中,则尝试执行a()的线程将阻塞,直到执行b()结束. >如果一个线程在b()中并且第二个线程试图运行b( ...

  8. java main 静态代码_java中没有main方法怎么怎么执行静态块中的内容

    展开全部 class Parent { static String name = "hello"; { System.out.println("parent  block ...

  9. swift 听筒模式_Swift中的“工厂方法”模式

    swift 听筒模式 定义 (Definition) 'Factory Method' pattern is a creational design pattern that abstracts th ...

最新文章

  1. 以软件开发生命周期来说明不同的测试的使用情况
  2. 【实用/转载】ALV OO Container屏幕自适应设置
  3. 为什么很多人说 Java 不适合编写桌面应用?
  4. linux安装java的脚本吗,Linux安装JDK脚本
  5. CentOS7安装EPEL源
  6. “换标”Intel的穷则思变
  7. i标签content属性输入空白
  8. [luoguP1005] 矩阵取数游戏(DP + 高精度)
  9. artcam2008 stp 教程_ArtCAM_中文版使用教程
  10. 宾夕法尼亚州立大学:探索量子AI如何加速治愈癌症
  11. STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板
  12. linkerd mysql_纠错帖:Zuul Spring Cloud Gateway Linkerd性能对比
  13. 51NOD - 1677treecnt
  14. LCD工作原理及结构
  15. springboot之spring-boot-starter-jdbc
  16. Amet beatae provident.Optio non quo facilis iste.
  17. MaxwellWorkbenchoptiSLang联合优化总结
  18. 各种品牌的Andr​​oid智能手机在Aliexpress.comstore833807
  19. 电信网通全国DNS 列表
  20. 计算机任务计划命令,从菜鸟到高手,CMD命令行计划任务设置(上):at

热门文章

  1. React中的模糊匹配与精准匹配
  2. 服务器ubuntu系统版本选型原则,系统集成 - 选择Ubuntu服务器版操作系统的六大理由_服务器应用_Linux公社-Linux系统门户网站...
  3. 处理api返回的数据_API 乐队指挥家,网关服务正式上线
  4. URLConnection-URL连接
  5. XML——使用 XPath来定位信息+使用命名空间
  6. java流与文件——内存映射文件
  7. 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
  8. Spring Boot错误–创建在类路径资源DataSourceAutoConfiguration中定义的名称为“ dataSource”的bean时出错...
  9. java jwt 验证_教程:用Java创建和验证JWT
  10. web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件