最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式之享元模式

 更新時間:2018年08月24日 14:16:01   作者:董秀才  
這篇文章主要為大家詳細介紹了Java設(shè)計模式之享元模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文介紹了Java設(shè)計模式之享元模式,供大家參考,具體內(nèi)容如下

1、關(guān)于享元模式  

享元模式有點類似于單例模式,都是只生成一個對象被共享使用。享元模式主要目的就是讓多個對象實現(xiàn)共享,減少不會要額內(nèi)存消耗,將多個對同一對象的訪問集中起來,不必為每個訪問者創(chuàng)建一個單獨的對象,以此來降低內(nèi)存的消耗。

2、享元模式結(jié)構(gòu)圖

因為享元模式結(jié)構(gòu)比較復(fù)雜,一般結(jié)合工廠模式一起使用,在它的結(jié)構(gòu)圖中包含了一個享元工廠類。

在享元模式結(jié)構(gòu)圖中包含如下幾個角色:

  Flyweight(抽象享元類):通常是一個接口或抽象類,在抽象享元類中聲明了具體享元類公共的方法,這些方法可以向外界提供享元對象的內(nèi)部數(shù)據(jù)(內(nèi)部狀態(tài)),同時也可以通過這些方法來設(shè)置外部數(shù)據(jù)(外部狀態(tài))。

  ConcreteFlyweight(具體享元類):它實現(xiàn)了抽象享元類,其實例稱為享元對象;在具體享元類中為內(nèi)部狀態(tài)提供了存儲空間。通常我們可以結(jié)合單例模式來設(shè)計具體享元類,為每一個具體享元類提供唯一的享元對象。

  UnsharedConcreteFlyweight(非共享具體享元類):并不是所有的抽象享元類的子類都需要被共享,不能被共享的子類可設(shè)計為非共享具體享元類;當(dāng)需要一個非共享具體享元類的對象時可以直接通過實例化創(chuàng)建。

  FlyweightFactory(享元工廠類):享元工廠類用于創(chuàng)建并管理享元對象,它針對抽象享元類編程,將各種類型的具體享元對象存儲在一個享元池中,享元池一般設(shè)計為一個存儲“鍵值對”的集合(也可以是其他類型的集合),可以結(jié)合工廠模式進行設(shè)計;當(dāng)用戶請求一個具體享元對象時,享元工廠提供一個存儲在享元池中已創(chuàng)建的實例或者創(chuàng)建一個新的實例(如果不存在的話),返回新創(chuàng)建的實例并將其存儲在享元池中。

3、享元模式的實現(xiàn)   

  在享元模式中引入了享元工廠類,享元工廠類的作用在于提供一個用于存儲享元對象的享元池,當(dāng)用戶需要對象時,首先從享元池中獲取,如果享元池中不存在,則創(chuàng)建一個新的享元對象返回給用戶,并在享元池中保存該新增對象。

  接下來,實現(xiàn)一個登陸的享元模式。

1、用戶類

/**
 * 用戶類
 * @author 董秀才
 *
 */
public class User {
 private String username; // 用戶名
 private String password; // 密碼
 
 public User(String username,String password) {
  this.username = username;
  this.password = password;
 }

 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }
}

2、抽象的登陸者(抽象享元類)

/**
 * 登陸者--抽象享元類
 * @author 董秀才
 *
 */
public abstract class Loginer {
 
 //登陸--享元類公共方法
 public abstract void login(User user);
 
}

3、具體的登陸者(具體享元類)

/**
 * 具體享元類
 * @author 董秀才
 *
 */
public class ConcreteLoginer extends Loginer{

 // 登陸者憑證
 private String loginerKey = "";
 public ConcreteLoginer(String loginerKey) {
  this.loginerKey = loginerKey;
 }
 
 @Override
 public void login(User user) {
  System.out.println("登陸者憑證:" + this.loginerKey+",用戶名:" + user.getUsername() + ",密碼:" + user.getPassword());
 }
 
} 

4、具體登陸者的工廠類(享元工廠類)

/**
 * 享元工廠類
 * @author 董秀才
 *
 */
public class ConcreteLoginerFactory {
 
 // map充當(dāng)對象享元池
 private static Map<String,ConcreteLoginer> loginerMap = new HashMap<String, ConcreteLoginer>();
 
 public static ConcreteLoginer getConcreteLoginer(String key) {
  // 從享元池中拿 登陸者對象
  ConcreteLoginer concreteLoginer = loginerMap.get(key);
  // 如果享元池中沒有此對象 
  if(concreteLoginer == null) {
   // 創(chuàng)建對象
   concreteLoginer = new ConcreteLoginer(key);
   // 存到享元池中
   loginerMap.put(key, concreteLoginer);
  }
  // 返回對象
  return concreteLoginer;
 }
 
 
 // 返回享元池對象數(shù)量
 public static int getSize() {
  return loginerMap.size();
 }
}

5、測試類 

/**
* 博客測試類
* @author 董秀才
*
*/
public class MainTest {

public static void main(String[] args) {
// 去工廠拿對象
ConcreteLoginer concreteLoginer_1 = ConcreteLoginerFactory.getConcreteLoginer("csdn");
concreteLoginer_1.login(new User("董秀才","123456"));

ConcreteLoginer concreteLoginer_2 = ConcreteLoginerFactory.getConcreteLoginer("csdn");
concreteLoginer_2.login(new User("董秀才","123456"));

ConcreteLoginer concreteLoginer_3 = ConcreteLoginerFactory.getConcreteLoginer("csdn");
concreteLoginer_3.login(new User("董秀才","123456"));

// 測試是否是同一個對象
System.out.println("是否是同一個對象:" + ((concreteLoginer_1==concreteLoginer_2)&&(concreteLoginer_2 == concreteLoginer_3)));


// 第二登陸者
ConcreteLoginer concreteLoginer_4 = ConcreteLoginerFactory.getConcreteLoginer("博客園");
concreteLoginer_4.login(new User("董才才","654321"));

ConcreteLoginer concreteLoginer_5 = ConcreteLoginerFactory.getConcreteLoginer("博客園");
concreteLoginer_5.login(new User("董才才","654321"));

ConcreteLoginer concreteLoginer_6 = ConcreteLoginerFactory.getConcreteLoginer("博客園");
concreteLoginer_6.login(new User("董才才","654321"));

System.out.println("是否是同一個對象:" + ((concreteLoginer_4==concreteLoginer_5)&&(concreteLoginer_5 == concreteLoginer_6)));
// 工廠類中享元池中對象數(shù)量
System.out.println("享元池size:" + ConcreteLoginerFactory.getSize());
}

} 

6、運行結(jié)果

4、總結(jié)

從上面代碼和運行結(jié)果這可以看到,同一個登陸者登陸時是  "享"  用同一個登陸者對象。在享元對象池中只有兩個對象。

享元模式優(yōu)點

  享元模式的外部狀態(tài)相對獨立,使得對象可以在不同的環(huán)境中被復(fù)用(共享對象可以適應(yīng)不同的外部環(huán)境)

  享元模式可共享相同或相似的細粒度對象,從而減少了內(nèi)存消耗,同時降低了對象創(chuàng)建與垃圾回收的開銷

享元模式缺點

  外部狀態(tài)由客戶端保存,共享對象讀取外部狀態(tài)的開銷可能比較大

  享元模式要求將內(nèi)部狀態(tài)與外部狀態(tài)分離,這使得程序的邏輯復(fù)雜化,同時也增加了狀態(tài)維護成本

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring cloud 使用Eureka 進行服務(wù)治理方法

    spring cloud 使用Eureka 進行服務(wù)治理方法

    這篇文章主要介紹了spring cloud 使用Eureka 進行服務(wù)治理方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 初步學(xué)習(xí)Java中線程的實現(xiàn)與生命周期

    初步學(xué)習(xí)Java中線程的實現(xiàn)與生命周期

    這篇文章主要介紹了初步學(xué)習(xí)Java中線程的實現(xiàn)與生命周期,線程方面的知識是Java學(xué)習(xí)過程中的重點和難點,需要的朋友可以參考下
    2015-11-11
  • 詳解RabbitMQ中死信隊列和延遲隊列的使用詳解

    詳解RabbitMQ中死信隊列和延遲隊列的使用詳解

    這篇文章主要為大家介紹了RabbitMQ中死信隊列和延遲隊列的原理與使用,這也是Java后端面試中常見的問題,感興趣的小伙伴可以了解一下
    2022-05-05
  • 深入了解SparkSQL中數(shù)據(jù)的加載與保存

    深入了解SparkSQL中數(shù)據(jù)的加載與保存

    這篇文章主要為大家詳細介紹了SparkSQL中數(shù)據(jù)的加載與保存的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下
    2023-11-11
  • springboot全局日期格式化的兩種方式

    springboot全局日期格式化的兩種方式

    這篇文章主要介紹了springboot全局日期格式化的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot替換默認(rèn)的tomcat服務(wù)器的方法

    SpringBoot替換默認(rèn)的tomcat服務(wù)器的方法

    Tomcat是Apache基金下的一個輕量級的Servlet容器,支持Servlet和JSP,Tomcat具有Web服務(wù)器特有的功能,在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot默認(rèn)的容器技術(shù),本文給大家介紹了Spring?Boot如何替換默認(rèn)的tomcat服務(wù)器,需要的朋友可以參考下
    2024-08-08
  • 詳解Java之路(五) 訪問權(quán)限控制

    詳解Java之路(五) 訪問權(quán)限控制

    本篇文章主要介紹了Java之路(五) 訪問權(quán)限控制 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。
    2016-12-12
  • Spring?Boot?教程之創(chuàng)建項目的三種方式

    Spring?Boot?教程之創(chuàng)建項目的三種方式

    這篇文章主要分享了Spring?Boot?教程之創(chuàng)建項目的三種方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • springmvc的validator數(shù)據(jù)校驗的實現(xiàn)示例代碼

    springmvc的validator數(shù)據(jù)校驗的實現(xiàn)示例代碼

    這篇文章主要介紹了springmvc的數(shù)據(jù)校驗的實現(xiàn)示例代碼, 具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Mybatis-Plus使用updateById()、update()將字段更新為null

    Mybatis-Plus使用updateById()、update()將字段更新為null

    本文主要介紹了Mybatis-Plus使用updateById()、update()將字段更新為null,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論

山丹县| 沁阳市| 湖南省| 新郑市| 漾濞| 宿松县| 平山县| 沂南县| 略阳县| 乌兰察布市| 桦南县| 静海县| 博乐市| 信丰县| 启东市| 安平县| 肥东县| 荣成市| 邵阳县| 襄樊市| 深圳市| 仪征市| 龙泉市| 瑞昌市| 金溪县| 安徽省| 乌恰县| 五家渠市| 涞水县| 吉首市| 吉林市| 河北省| 百色市| 博爱县| 奇台县| 永城市| 星子县| 罗定市| 周至县| 淮阳县| 泸水县|