合肥网站建设设计,展厅建筑设计厂家,网站备案接口,帮人做网站在徐州被敲诈五万java 工厂方法模式在上一篇有关模板方法模式的文章中 #xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中#xff0c;我将探讨工厂方法模式#xff0c;并了解如何利用方法引用#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Ve… 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实现使用。 参考 JCG合作伙伴 Mohamed Sanaulla在Javas中的Factory Method模式来自Experiences Unlimited博客。 翻译自: https://www.javacodegeeks.com/2013/05/factory-method-pattern-in-java.htmljava 工厂方法模式