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

Java設(shè)計模式之享元模式實例詳解

 更新時間:2018年04月09日 14:40:59   作者:炸斯特  
這篇文章主要介紹了Java設(shè)計模式之享元模式,結(jié)合實例形式詳細分析了享元模式的概念、功能、定義及使用方法,需要的朋友可以參考下

本文實例講述了Java設(shè)計模式之享元模式。分享給大家供大家參考,具體如下:

解釋一下概念:也就是說在一個系統(tǒng)中如果有多個相同的對象,那么只共享一份就可以了,不必每個都去實例化一個對象。比如說一個文本系統(tǒng),每個字母定一個對象,那么大小寫字母一共就是52個,那么就要定義52個對象。如果有一個1M的文本,那么字母是何其的多,如果每個字母都定義一個對象那么內(nèi)存早就爆了。那么如果要是每個字母都共享一個對象,那么就大大節(jié)約了資源。

在Flyweight模式中,由于要產(chǎn)生各種各樣的對象,所以在Flyweight(享元)模式中常出現(xiàn)Factory模式。Flyweight的內(nèi)部狀態(tài)是用來共享的,Flyweight factory負責(zé)維護一個對象存儲池(Flyweight Pool)來存放內(nèi)部狀態(tài)的對象。Flyweight模式是一個提高程序效率和性能的模式,會大大加快程序的運行速度.應(yīng)用場合很多,下面舉個例子:

先定義一個抽象的Flyweight類:

package Flyweight;
public abstract class Flyweight{
public abstract void operation();
}

實現(xiàn)一個具體類:

package Flyweight;
public class ConcreteFlyweight extends Flyweight{
private String string;
public ConcreteFlyweight(String str){
string = str;
}
public void operation()
{
System.out.println("Concrete---Flyweight : " + string);
}
}

實現(xiàn)一個工廠方法類:

package Flyweight;
import java.util.Hashtable;
public class FlyweightFactory{
private Hashtable flyweights = new Hashtable();//----------------------------1
public FlyweightFactory(){}
public Flyweight getFlyWeight(Object obj){
Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2
if(flyweight == null){//---------------------------------------------------3
//產(chǎn)生新的ConcreteFlyweight
flyweight = new ConcreteFlyweight((String)obj);
flyweights.put(obj, flyweight);//--------------------------------------5
}
return flyweight;//---------------------------------------------------------6
}
public int getFlyweightSize(){
return flyweights.size();
}
}

這個工廠方法類非常關(guān)鍵,這里詳細解釋一下:

在1處定義了一個Hashtable用來存儲各個對象;在2處選出要實例化的對象,在6處將該對象返回,如果在Hashtable中沒有要選擇的對象,此時變量flyweight為null,產(chǎn)生一個新的flyweight存儲在Hashtable中,并將該對象返回。

最后看看Flyweight的調(diào)用:

package Flyweight;
import java.util.Hashtable;
public class FlyweightPattern{
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1;
Flyweight fly2;
Flyweight fly3;
Flyweight fly4;
Flyweight fly5;
Flyweight fly6;
/** *//** Creates a new instance of FlyweightPattern */
public FlyweightPattern(){
fly1 = factory.getFlyWeight("Google");
fly2 = factory.getFlyWeight("Qutr");
fly3 = factory.getFlyWeight("Google");
fly4 = factory.getFlyWeight("Google");
fly5 = factory.getFlyWeight("Google");
fly6 = factory.getFlyWeight("Google");
}
public void showFlyweight(){
fly1.operation();
fly2.operation();
fly3.operation();
fly4.operation();
fly5.operation();
fly6.operation();
int objSize = factory.getFlyweightSize();
System.out.println("objSize = " + objSize);
}
public static void main(String[] args){
System.out.println("The FlyWeight Pattern!");
FlyweightPattern fp = new FlyweightPattern();
fp.showFlyweight();
}
}

下面是運行結(jié)果:

Concrete---Flyweight : Google
Concrete---Flyweight : Qutr
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
objSize = 2

我們定義了6個對象,其中有5個是相同的,按照Flyweight模式的定義“Google”應(yīng)該共享一個對象,在實際的對象數(shù)中我們可以看出實際的對象卻是只有2個。

總結(jié):

Flyweight(享元)模式是如此的重要,因為它能幫你在一個復(fù)雜的系統(tǒng)中大量的節(jié)省內(nèi)存空間。在JAVA語言中,String類型就是使用了享元模式。String對象是final類型,對象一旦創(chuàng)建就不可改變。在JAVA中字符串常量都是存在常量池中的,JAVA會確保一個字符串常量在常量池中只有一個拷貝。String a="abc",其中"abc"就是一個字符串常量。

熟悉java的應(yīng)該知道下面這個例子:

String a = "hello";
String b = "hello";
if(a == b)
System.out.println("OK");
else
System.out.println("Error");

輸出結(jié)果是:OK??梢钥闯鰅f條件比較的是兩a和b的地址,也可以說是內(nèi)存空間

核心總結(jié),可以共享的對象,也就是說返回的同一類型的對象其實是同一實例,當(dāng)客戶端要求生成一個對象時,工廠會檢測是否存在此對象的實例,如果存在那么直接返回此對象實例,如果不存在就創(chuàng)建一個并保存起來,這點有些單例模式的意思。通常工廠類會有一個集合類型的成員變量來用以保存對象,如hashtable,vector等。在java中,數(shù)據(jù)庫連接池,線程池等即是用享元模式的應(yīng)用。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • Java8使用LocalDate計算日期實例代碼解析

    Java8使用LocalDate計算日期實例代碼解析

    這篇文章主要介紹了Java8使用LocalDate計算實例代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot沒有讀取到application.yml問題及解決

    SpringBoot沒有讀取到application.yml問題及解決

    這篇文章主要介紹了SpringBoot沒有讀取到application.yml問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解Java變量與常量

    詳解Java變量與常量

    這篇文章主要介紹了Java變量與常量,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java調(diào)用Oracle存儲過程詳解

    Java調(diào)用Oracle存儲過程詳解

    這篇文章主要介紹了Java調(diào)用Oracle存儲過程詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java處理表格的實用工具庫

    Java處理表格的實用工具庫

    EasyExcel是一個基于Java的簡單、省內(nèi)存的讀寫Excel的開源項目,在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M的Excel,下面這篇文章主要給大家分享介紹了一個關(guān)于Java處理表格的實用工具庫,需要的朋友可以參考下
    2021-11-11
  • java封裝前端查詢條件通用版

    java封裝前端查詢條件通用版

    這篇文章主要為大家詳細介紹了java封裝前端查詢條件的通用版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Flink實現(xiàn)特定統(tǒng)計的歸約聚合reduce操作

    Flink實現(xiàn)特定統(tǒng)計的歸約聚合reduce操作

    這篇文章主要介紹了Flink實現(xiàn)特定統(tǒng)計的歸約聚合reduce操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • 解決mapper.xml中resultType映射類型的問題

    解決mapper.xml中resultType映射類型的問題

    這篇文章主要介紹了解決mapper.xml中resultType映射類型的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java的IO模型、Netty原理解析

    Java的IO模型、Netty原理解析

    Java的I/O是以流的方式進行數(shù)據(jù)輸入輸出的,Java的類庫涉及很多領(lǐng)域的IO內(nèi)容:標(biāo)準(zhǔn)的輸入輸出,文件的操作、網(wǎng)絡(luò)上的數(shù)據(jù)傳輸流、字符串流、對象流等,這篇文章主要介紹了Java的IO模型、Netty原理詳解,需要的朋友可以參考下
    2025-03-03
  • 詳解Java設(shè)計模式之外觀模式

    詳解Java設(shè)計模式之外觀模式

    在Java開發(fā)中,設(shè)計模式是一種十分常見的編程思想,它可以幫助我們解決很多實際開發(fā)中的問題,本篇文章將介紹一種常見的設(shè)計模式——外觀模式,并結(jié)合實際的開發(fā)場景進行講解,需要的朋友可以參考下
    2023-06-06

最新評論

上犹县| 应城市| 寻甸| 松滋市| 天津市| 新干县| 怀集县| 广州市| 黔西县| 华阴市| 娱乐| 册亨县| 永寿县| 德阳市| 辰溪县| 吴江市| 蕲春县| 托里县| 新闻| 军事| 华安县| 泸定县| 乌鲁木齐县| 玛多县| 增城市| 博罗县| 阜平县| 内黄县| 清镇市| 无极县| 木兰县| 固始县| 塔河县| 霞浦县| 咸丰县| 汶上县| 建平县| 光山县| 沁源县| 辽宁省| 成安县|