文档章节

Java 8 中的工厂方法模式

编走编想
 编走编想
发布于 2013/06/01 22:08
字数 542
阅读 467
收藏 13

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

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

示例

先举一个汽车的栗子

<!-- lang: java -->
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 及其之前版本的工厂方法

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

在使用时

<!-- 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 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 一个新对象,还需要做很多别的事情。这时,使用闭包就变得很容易实现这个目的了。

© 著作权归作者所有

共有 人打赏支持
编走编想
粉丝 150
博文 128
码字总数 111395
作品 0
海淀
程序员
私信 提问
设计模式(九)[创建模式] 工厂方法模式(Factory Method)

工厂方法模式是简单工厂模式进一步抽象和推广。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为抽象工厂的角色,仅...

1527
2018/08/12
0
0
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
0
2
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之所...

路小磊
2018/07/21
0
10
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
2018/10/30
0
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue组件系列2、拖放上传

直接上源码,就是样式不太好看,但是该有的功能都有啦 <template> <div class="pre_upload" @drop="okdrop($event)" @dragover="allowDrop($event)" > <div clas......

轻轻的往前走
6分钟前
0
0
kubernetes 二进制包安装

环境 角色 主机名 内网 IP 集群 IP 操作系统 服务 执行目录 部署机 k8s-master master120 10.0.4.120 - CentOS kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/ et......

Colben
36分钟前
5
0
瑞达利欧的《原则》读后感作文2400字

瑞达利欧的《原则》读后感作文2400字: 拿到同事送的书读了几十页后,我意识到自己犯了一个错误:之前以为像《原则》这个书名,配上最成功的对冲基金经理、受用终身的教诲、傅盛引用并盛赞,...

原创小博客
53分钟前
1
0
java内存占用异常问题常见排查流程(含堆外内存异常)

先初步介绍一下内存组成: java进程占用内存 约等于 Java永久代 + Java堆(新生代和老年代) + 线程栈+ Java NIO,其它部分占用内存较小, 详细可以参考这篇文章 https://my.oschina.net/h...

小海bug
今天
3
0
成为架构师需要学习哪些技能?阿里P9架构师为你解答

不想当将军的兵不是好兵,就程序猿不想当架构师就不是好的程序员! Java架构师主要需要做哪些工作呢? 1、负责设计和搭建软件系统架构(平台、数据库、接口和应用架构等),解决开发中各种系...

别打我会飞
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部