java 工厂方法模式
在上一篇有关模板方法模式的文章中 ,我展示了如何利用lambda表达式和默认方法 。 在本文中,我将探讨工厂方法模式,并了解如何利用方法引用,这是Java 8中与lambda表达式一起添加的另一项功能。
让我们考虑一个Vehicle
接口及其两个实现,即Car
和Vehicle
。
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()
方法是工厂方法,被CarDriver
和Busdriver
覆盖以分别返回Car
和Bus
实例。 这样,程序员将更加关注使用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
不同实现。 这些方法引用为代码提供了一种获取所需的Car
或Bus
类实例的方法,而无需陷入重写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。 但是,随着所有新功能的出现,学习曲线也随之增加。
注意:在上述两种实现中,共同的部分是Vehicle
, Car
和Bus
类,它们由Java 7和Java 8实现使用。
翻译自: https://www.javacodegeeks.com/2013/05/factory-method-pattern-in-java.html
java 工厂方法模式