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

java 工厂方法模式

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

让我们考虑一个Vehicle接口及其两个实现,即CarVehicle

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...");
  }
}

为了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{
  @Override
  public Vehicle getVehicle(){
    return new Car();
  }
}

class BusDriver extends VehicleDriver{
  @Override
  public 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 工厂方法模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值