为什么80%的码农都做不了架构师?>>>   

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

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

示例

先举一个汽车的栗子

<!-- lang: java -->
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...");}
}

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

<!-- lang: java -->
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();}
}

在使用时

<!-- lang: java -->
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 来简化工厂方法的实现

<!-- lang: java -->
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 referencehandleVehicle(() -> 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

Java 8 中的工厂方法模式相关推荐

  1. Java 设计模式之静态工厂方法模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

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

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

  3. Java中的工厂方法模式

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

  4. JAVA【设计模式】工厂方法模式

    工厂方法模式 一.定义 二.示例: 传统硬编码方式(都在一个类里面实现,多重if else嵌套使用) 工厂方法模式设计 一.定义 ⼯⼚模式⼜称⼯⼚⽅法模式,是⼀种创建型设计模式,其在⽗类中提供⼀个创建 ...

  5. java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式

    工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...

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

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

  7. java中factory_JAVA工厂方法模式(Factory Method)

    1.普通工厂模式 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 1-1.建立Sender接口 public interface Sender { public void ...

  8. 工厂方法模式java实例,设计模式之工厂方法模式实例(Java)

    海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) .使用工厂方法模式描述该场景,绘制类图并编程实现. ...

  9. WebRequest中的工厂方法模式

    转载于:https://www.cnblogs.com/taomylife/p/3591197.html

最新文章

  1. 创建一个简单的存储过程(RroGetA_Z),要求输出A到Z之间的26个大写字母
  2. commons-collections使用介绍之Bag HashBag
  3. ImportError: dynamic module does not define module export function (PyInit_example)
  4. python django restful_详解Django rest_framework实现RESTful API
  5. 十七、去年jQuery的笔记
  6. LeetCode-- Unique Binary Search Trees II
  7. .net core json 为null输出_SpringBoot实战(九):标准化json返回值
  8. 计算机二级C选择题精华
  9. Linux 命令(40)—— nohup 命令
  10. oracle 创建备份目录,Oracle rman创建和自动化备份
  11. iOS底层探索之多线程(九)—GCD源码分析(栅栏函数)
  12. Python 代码使用pdb调试技巧
  13. sql server2012 远程访问设置(转)
  14. 在Web上运行Linux
  15. springboot+vue+easychart报表导出前后台
  16. u2000网管服务器系统安装,U2000网管预安装后无法登陆
  17. 好用的PDF解密工具哪个好?
  18. QString 中文编码转换
  19. 重启计算机后回收站,电脑回收站文件被清空了该如何恢复
  20. php去除换行(回车换行)的方法

热门文章

  1. 戴尔全面进军一体机市场【我眼中的戴尔转型】
  2. 小话设计模式三:发布/订阅模式
  3. linux打补丁前如何备份,关于Linux下给文件打补丁
  4. 中科院的java_java 中调用中科院分词系统
  5. 计算机安全监控系统,关于计算机安全监控系统的关键技术
  6. linux系统中防止系统时间,设置系统时间与在Linux中
  7. 简单了解各种序列化技术-Avro序列化
  8. 扩展--使用队列来优化递归操作完成文件下载
  9. 算术运算符_加号的多种用法
  10. spring基于注解的声明式事务控制