一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用Java 8中的Lambda表達式實現工廠模式

使用Java 8中的Lambda表達式實現工廠模式

2020-09-05 12:07馬傳林 Java教程

這篇文章主要給大家介紹了使用Java 8中的Lambda表達式實現工廠模式的相關資料,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。

前言

工廠模式是面向對象設計模式中大家最為熟知的設計模式之一。傳統的實現方式大家都在熟悉不過了,今天將向大家介紹使用Java8 Lambda 表達式更加優雅的實現工廠模式。

封面

工廠模式在java中最常用的設計模式之一,它提供了一種很好的實例化對象的方法,是替代new操作的一種模式常用的方式。工廠設計模式可以讓你實例化對象的邏輯不用暴露給客戶端。

在下面的文章中我將給出使用傳統的代碼實現工廠模式的一個例子,然后再使用 Java8 Lambada 方式重新實現

一個例子

首先我將創建一個 Shape 接口以及幾個實現類,然后會在接下來的步驟中實現ShapeFactory,最后會給出詳細的調用實例并輸出結果。

新建接口:Shape.java

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

定義兩個 Shape的實現類:Circle.java & Rectangle.java

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

創建Shape的工廠類,并實現根據指定參數返回不同的Shape的工廠方法:

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

ShapeFactory 根據傳入的shapeType 返回不同的Shape。

下面是具體使用的例子。

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

程序輸出

?
1
2
Inside Circle::draw() method.
Inside Rectangle::draw() method.

使用Lambada實現工廠模式

Lambda表達式允許我們定義一個匿名方法,并允許我們以函數式接口的方式使用它。我們也希望能夠在已有的方法上實現同樣的特性。

方法引用和lambda表達式擁有相同的特性(例如,它們都需要一個目標類型,并需要被轉化為函數式接口的實例),不過我們并不需要為方法引用提供方法體,我們可以直接通過方法名稱引用已有方法。

下面例子展示了構造方法引用

?
1
2
Supplier circleSupplier = Circle::new;
Circle circle = circleSupplier.get();

根據構造方法引用的原理,我們可以重寫之前的代碼,定義一個Map來保存shape name 和它對應的構造方法引用:

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

現在我們可以使用這個map來實例化不同的shapes

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

使用lambada表達式實現的工廠方法來創建shape對象:

FactoryPatternDemo.java

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

程序輸出

?
1
2
Inside Circle::draw() method.
Inside Rectangle::draw() method.

這里的Shape::new可以被看作為lambda表達式的簡寫形式。盡管方法引用不一定(比如在這個例子里)會把語法變的更緊湊,但它擁有更明確的語義——如果我們想要調用的方法擁有一個名字,我們就可以通過它的名字直接調用它。

如果Shape構造函數需要多個參數,那么你就需要重新實現自己的Supplier

如:

?
1
() -> new Circe(args)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://blog.maxleap.cn/archives/1300

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 污软件在线观看 | 爱草视频 | 久久精品国产亚洲AV蜜臀 | zozzozozozo大 | 国产精品久久久久久久久齐齐 | 精品视频在线免费看 | 和岳m的小说 | 女被男啪到哭 | 风间由美被义子中文字幕 | 日本红怡院亚洲红怡院最新 | 日韩欧美一区二区三区 | 四虎精品成人a在线观看 | a级特黄毛片免费观看 | 黄网在线观看免费网站台湾swag | 国产精品反差婊在线观看 | 啊啊啊好大视频 | 金莲一级淫片aaaaaa | 欧美xxxxx69 | 国产精品第页 | 国产亚洲精品美女2020久久 | 亚洲国产麻豆 | 99久女女精品视频在线观看 | 欧美又大又粗又长又硬 | 日本最新伦中文字幕 | 荡女人人爱全文免费阅读 | 美人的淫事[纯hh] | 太大了轻点阿受不了小说h 四色6677最新永久网站 | 特级毛片全部免费播放器 | 2021精品国夜夜天天拍拍 | 久久re这里精品在线视频7 | 九九九久久久 | 91免费高清视频 | 国产精品久久久久久久久久久久久久 | 国产四虎 | 激情视频网址 | 亚洲天堂男人天堂 | 人与动人物人a级特片 | 国精品午夜dy8888狼人 | 私人家庭影院5577 | 亚洲欧美日韩精品久久亚洲区 | 国产成人在线播放视频 |