关键词搜索

源码搜索 ×
×

工厂模式使用Java 8中的Lambda表达式

发布2017-03-06浏览1037次

详情内容

原文地址:https://dzone.com/articles/factory-pattern-using-lambda-expression-in-java-8?utm_source=Top%205&utm_medium=email&utm_campaign=2017-03-04

工厂模式是Java中最着名的模式之一。 如果你使用lambda表达式,你可以使用它们来实现模式,但要小心缩放。

   · Java区

工厂模式是Java中最常用的设计模式之一。 这种类型的设计模式属于主机的创造模式,因为这种模式提供了一种最好的方式来创建一个对象。 工厂设计模式允许您创建对象,而不将实例化逻辑暴露给客户端。

在这篇文章中,我想给出一个Factory模式的示例,然后使用在Java 8中引入的lambda表达式重写相同的示例。

工厂模式:一个例子

我将创建一个Shape接口以及实现Shape接口的具体类。 一个工厂类ShapeFactory被定义为下一步。

创建一个接口: Shape.java

  1. public interface Shape {
  2. void draw();
  3. }


考虑这个Shape接口的两个实现: Circle.java & Rectangle.java

  1. public class Rectangle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Inside Rectangle::draw() method.");
  5. }
  6. }
  7. public class Circle implements Shape {
  8. @Override
  9. public void draw() {
  10. System.out.println("Inside Circle::draw() method.");
  11. }
  12. }


创建工厂根据给定信息生成具体类的对象。

  1. public class ShapeFactory {
  2. //use getShape method to get object of type shape
  3. public Shape getShape(String shapeType){
  4. if(shapeType == null){
  5. return null;
  6. }
  7. if(shapeType.equalsIgnoreCase("CIRCLE")){
  8. return new Circle();
  9. } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
  10. return new Rectangle();
  11. }
  12. return null;
  13. }
  14. }


使用Factory通过传递类型为: FactoryPatternDemo.java的信息来获取具体类的对象

  1. public class FactoryPatternDemo {
  2. public static void main(String[] args) {
  3. ShapeFactory shapeFactory = new ShapeFactory();
  4. //get an object of Circle and call its draw method.
  5. Shape shape1 = shapeFactory.getShape("CIRCLE");
  6. //call draw method of Circle
  7. shape1.draw();
  8. //get an object of Rectangle and call its draw method.
  9. Shape shape2 = shapeFactory.getShape("RECTANGLE");
  10. //call draw method of Rectangle
  11. shape2.draw();
  12. }
  13. }


验证输出:

Inside Circle::draw() method.

Inside Rectangle::draw() method.


工厂模式:使用Lambda表达式的重构

在Java 8中,我们可以参考构造函数,就像我们引用方法一样,通过使用 
方法引用。 例如,下面是如何引用Circle构造函数:

  1. Supplier<Shape> circleSupplier = Circle::new;
  2. Circle circle = circleSupplier.get();


使用这种技术,我们可以通过创建映射形状的Map来重写前面的代码 
名称到其构造函数:

  1. final static Map<String, Supplier<Shape>> map = new HashMap<>();
  2. static {
  3. map.put("CIRCLE", Circle::new);
  4. map.put("RECTANGLE", Rectangle::new);
  5. }


我们现在可以使用这个Map来实例化不同的形状,就像我们以前的工厂代码一样:

  1. public class ShapeFactory {
  2. final static Map<String, Supplier<Shape>> map = new HashMap<>();
  3. static {
  4. map.put("CIRCLE", Circle::new);
  5. map.put("RECTANGLE", Rectangle::new);
  6. }
  7. public Shape getShape(String shapeType){
  8. Supplier<Shape> shape = map.get(shapeType.toUpperCase());
  9. if(shape != null) {
  10. return shape.get();
  11. }
  12. throw new IllegalArgumentException("No such shape " + shapeType.toUpperCase());
  13. }
  14. }


使用工厂获得具体类的对象,使用lambda表达式: FactoryPatternDemo.java

  1. public class FactoryPatternDemo {
  2. public static void main(String[] args) {
  3. Supplier<ShapeFactory> shapeFactory = ShapeFactory::new;
  4. //call draw method of circle
  5. shapeFactory.get().getShape("circle").draw();
  6. //call draw method of Rectangle
  7. shapeFactory.get().getShape("rectangle").draw();
  8. }
  9. }


验证输出:

Inside Circle::draw() method.

Inside Rectangle::draw() method.

这是一个相当整洁的方式使用Java 8功能来实现相同的意图工厂模式。 但是这种技术不能很好地缩放,如果工厂方法getShape 需要采取多个参数传递给Shape构造函数! 你必须提供与简单的供应商不同的功能接口。



相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载