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

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

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

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

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

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

先定義一個(gè)抽象的Flyweight類:

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

實(shí)現(xiàn)一個(gè)具體類:

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

實(shí)現(xiàn)一個(gè)工廠方法類:

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

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

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

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

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

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

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

總結(jié):

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

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

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

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

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

相關(guān)文章

  • 通過Spring AOP實(shí)現(xiàn)異常捕捉機(jī)制

    通過Spring AOP實(shí)現(xiàn)異常捕捉機(jī)制

    在開發(fā)過程中,異常處理是一個(gè)不可忽視的重要環(huán)節(jié),合理、優(yōu)雅地處理異常不僅能提高代碼的魯棒性,還能提升系統(tǒng)的用戶體驗(yàn),本文將介紹如何通過Spring AOP實(shí)現(xiàn)一個(gè)高效的異常捕捉機(jī)制,使得異常處理變得更加優(yōu)雅和統(tǒng)一,需要的朋友可以參考下
    2024-08-08
  • 實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開源,作者用其Windows平臺(tái)下的版本進(jìn)行演示,需要的朋友可以參考下
    2016-01-01
  • SpringBoot中分頁插件PageHelper的使用詳解

    SpringBoot中分頁插件PageHelper的使用詳解

    分頁查詢是為了高效展示大量數(shù)據(jù),通過分頁將數(shù)據(jù)劃分為多個(gè)部分逐頁展示,原生方法需手動(dòng)計(jì)算數(shù)據(jù)起始行,而使用PageHelper插件則簡化這一過程,本文給大家介紹SpringBoot中分頁插件PageHelper的使用,感興趣的朋友一起看看吧
    2024-09-09
  • springboot 整合郵件發(fā)送功能

    springboot 整合郵件發(fā)送功能

    這篇文章主要介紹了springboot 整合郵件發(fā)送功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Springboot幾種任務(wù)的整合方法

    Springboot幾種任務(wù)的整合方法

    這篇文章主要介紹了Springboot幾種任務(wù)的整合方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java 終止線程的4種方式小結(jié)

    java 終止線程的4種方式小結(jié)

    本文主要介紹了java終止線程的4種方式小結(jié),包含布爾標(biāo)志位,interrupt()方法,stop()方法和Thread.interrupt()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 用Java實(shí)現(xiàn)小球碰壁反彈的簡單實(shí)例(算法十分簡單)

    用Java實(shí)現(xiàn)小球碰壁反彈的簡單實(shí)例(算法十分簡單)

    下面小編就為大家?guī)硪黄肑ava實(shí)現(xiàn)小球碰壁反彈的簡單實(shí)例(算法十分簡單)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • spring mail借助qq郵箱服務(wù)器發(fā)送郵件

    spring mail借助qq郵箱服務(wù)器發(fā)送郵件

    這篇文章主要介紹了spring mail借助qq郵箱服務(wù)器發(fā)送郵件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring注解配置AOP導(dǎo)致通知執(zhí)行順序紊亂解決方案

    Spring注解配置AOP導(dǎo)致通知執(zhí)行順序紊亂解決方案

    這篇文章主要介紹了Spring注解配置AOP導(dǎo)致通知執(zhí)行順序紊亂解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java Socket編程(一) Socket傳輸模式

    Java Socket編程(一) Socket傳輸模式

    Java Socket編程(一) Socket傳輸模式...
    2006-12-12

最新評(píng)論