欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Java 8中的Lambda表達(dá)式實(shí)現(xiàn)工廠模式

 更新時(shí)間:2017年04月03日 09:14:49   作者:馬傳林  
這篇文章主要給大家介紹了使用Java 8中的Lambda表達(dá)式實(shí)現(xiàn)工廠模式的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

工廠模式是面向?qū)ο笤O(shè)計(jì)模式中大家最為熟知的設(shè)計(jì)模式之一。傳統(tǒng)的實(shí)現(xiàn)方式大家都在熟悉不過(guò)了,今天將向大家介紹使用Java8 Lambda 表達(dá)式更加優(yōu)雅的實(shí)現(xiàn)工廠模式。

封面

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

在下面的文章中我將給出使用傳統(tǒng)的代碼實(shí)現(xiàn)工廠模式的一個(gè)例子,然后再使用 Java8 Lambada 方式重新實(shí)現(xiàn)

一個(gè)例子

首先我將創(chuàng)建一個(gè) Shape 接口以及幾個(gè)實(shí)現(xiàn)類(lèi),然后會(huì)在接下來(lái)的步驟中實(shí)現(xiàn)ShapeFactory,最后會(huì)給出詳細(xì)的調(diào)用實(shí)例并輸出結(jié)果。

新建接口:Shape.java

public interface Shape {
 void draw();
}

定義兩個(gè) Shape的實(shí)現(xiàn)類(lèi):Circle.java & Rectangle.java

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

創(chuàng)建Shape的工廠類(lèi),并實(shí)現(xiàn)根據(jù)指定參數(shù)返回不同的Shape的工廠方法:

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 根據(jù)傳入的shapeType 返回不同的Shape。

下面是具體使用的例子。

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();
 }
}

程序輸出

Inside Circle::draw() method.
Inside Rectangle::draw() method.

使用Lambada實(shí)現(xiàn)工廠模式

Lambda表達(dá)式允許我們定義一個(gè)匿名方法,并允許我們以函數(shù)式接口的方式使用它。我們也希望能夠在已有的方法上實(shí)現(xiàn)同樣的特性。

方法引用和lambda表達(dá)式擁有相同的特性(例如,它們都需要一個(gè)目標(biāo)類(lèi)型,并需要被轉(zhuǎn)化為函數(shù)式接口的實(shí)例),不過(guò)我們并不需要為方法引用提供方法體,我們可以直接通過(guò)方法名稱(chēng)引用已有方法。

下面例子展示了構(gòu)造方法引用

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

根據(jù)構(gòu)造方法引用的原理,我們可以重寫(xiě)之前的代碼,定義一個(gè)Map來(lái)保存shape name 和它對(duì)應(yīng)的構(gòu)造方法引用:

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

現(xiàn)在我們可以使用這個(gè)map來(lái)實(shí)例化不同的shapes

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表達(dá)式實(shí)現(xiàn)的工廠方法來(lái)創(chuàng)建shape對(duì)象:

FactoryPatternDemo.java

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();  
 }
}

程序輸出

Inside Circle::draw() method.
Inside Rectangle::draw() method.

這里的Shape::new可以被看作為lambda表達(dá)式的簡(jiǎn)寫(xiě)形式。盡管方法引用不一定(比如在這個(gè)例子里)會(huì)把語(yǔ)法變的更緊湊,但它擁有更明確的語(yǔ)義——如果我們想要調(diào)用的方法擁有一個(gè)名字,我們就可以通過(guò)它的名字直接調(diào)用它。

如果Shape構(gòu)造函數(shù)需要多個(gè)參數(shù),那么你就需要重新實(shí)現(xiàn)自己的Supplier

如:

() -> new Circe(args)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java多線程之線程安全問(wèn)題詳細(xì)解析

    Java多線程之線程安全問(wèn)題詳細(xì)解析

    這篇文章主要給大家介紹了關(guān)于Java多線程之線程安全問(wèn)題的相關(guān)資料,Java多線程中線程安全問(wèn)題是一個(gè)常見(jiàn)的問(wèn)題,因?yàn)槎鄠€(gè)線程可能同時(shí)訪問(wèn)共享的資源,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Maven版本沖突的三種解決方法

    Maven版本沖突的三種解決方法

    在Maven項(xiàng)目中,依賴傳遞可能導(dǎo)致Jar包版本沖突,常見(jiàn)的解決策略包括依賴排除、版本鎖定和使用maven-shade-plugin插件,本文就來(lái)介紹一下這三種解決方法,感興趣的可以了解一下
    2024-10-10
  • maven項(xiàng)目test執(zhí)行main找不到資源文件的問(wèn)題及解決

    maven項(xiàng)目test執(zhí)行main找不到資源文件的問(wèn)題及解決

    這篇文章主要介紹了maven項(xiàng)目test執(zhí)行main找不到資源文件的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java 排序算法之歸并排序

    java 排序算法之歸并排序

    本文主要講解了排序算法中的歸并排序,文中運(yùn)用大量的圖片和代碼講解的非常詳細(xì),感興趣的朋友可以學(xué)習(xí)一下這篇文章,相信可以幫助到你
    2021-09-09
  • SpringBoot Redis配置多數(shù)據(jù)源的項(xiàng)目實(shí)踐

    SpringBoot Redis配置多數(shù)據(jù)源的項(xiàng)目實(shí)踐

    springboot中默認(rèn)的redis配置是只能對(duì)單個(gè)redis庫(kù)進(jìn)行操作的, 那么我們需要多個(gè)庫(kù)操作的時(shí)候這個(gè)時(shí)候就可以采用redis多數(shù)據(jù)源 ,本文就介紹了SpringBoot Redis配置多數(shù)據(jù)源,感興趣的可以了解一下
    2023-07-07
  • SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗(yàn)

    SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗(yàn)

    這篇文章主要介紹了SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢

    springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢

    這篇文章主要介紹了springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 基于java實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng)

    基于java實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)停車(chē)場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • springboot攔截器Interceptor的使用,你都了解嗎

    springboot攔截器Interceptor的使用,你都了解嗎

    springmvc 中的攔截器可以對(duì)請(qǐng)求進(jìn)行判別,在請(qǐng)求到達(dá)控制器之前,把非法的請(qǐng)求給攔截掉下面來(lái)說(shuō)一說(shuō), 它在springboot中的使用,感興趣的朋友一起看看吧
    2021-07-07
  • MybatisPlus 多租戶架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解

    MybatisPlus 多租戶架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解

    這篇文章主要介紹了MybatisPlus 多租戶架構(gòu)(Multi-tenancy)實(shí)現(xiàn)詳解,詳細(xì)的介紹了什么是多租戶架構(gòu)以及使用MybatisPlus實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11

最新評(píng)論