日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

享员模式

發(fā)布時(shí)間:2025/7/25 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 享员模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述:

?????? 所謂享員模式就是運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對象的復(fù)用,Java語言中String類型就使用了享元模式。String對象是不變對象,一旦創(chuàng)建出來就不能改變。在jvm內(nèi)部,String對象是共享的,如果一個(gè)系統(tǒng)有兩個(gè)String對象所包含字符串相同的話,jvm實(shí)際只創(chuàng)建一個(gè)string對象提供給兩個(gè)引用,從而實(shí)現(xiàn)string對象的共享。

????? 共享模式支持大量細(xì)粒度對象的復(fù)用。

????? 內(nèi)部狀態(tài):在享元對象內(nèi)部不隨外部環(huán)境改變而變化的共享部分。

?????? 外部狀態(tài):隨著環(huán)境的改變而改變,不能夠共享的狀態(tài)就是外部狀態(tài)。

由于享元模式區(qū)分了內(nèi)部狀態(tài)和外部狀態(tài),所以我們可以通過設(shè)置不同的外部狀態(tài)使得相同的對象可以具備一些不同的特性,而內(nèi)部狀態(tài)設(shè)置為相同部分。

?????

抽象享元角色:具體享元類的超類,那些需要外蘊(yùn)狀態(tài)的操作可以調(diào)用商業(yè)方法以參數(shù)形式傳入。

具體享元角色:實(shí)現(xiàn)抽象享元角色所規(guī)定的接口,如果有內(nèi)蘊(yùn)狀態(tài)的話,必須負(fù)責(zé)為內(nèi)蘊(yùn)狀態(tài)提供存儲(chǔ)空間,享元對象的內(nèi)蘊(yùn)狀態(tài)必須與對象所處的周圍環(huán)境無關(guān),從而使得享元對象可以在系統(tǒng)內(nèi)共享的。

3.享元工廠角色:本角色負(fù)責(zé)創(chuàng)建和管理享元角色。本角色必須保證享元對象可以被系統(tǒng)適當(dāng)?shù)毓蚕怼.?dāng)一個(gè)客戶端對象調(diào)用一個(gè)享元對象的時(shí)候,享元工廠角色會(huì)檢查系統(tǒng)中是否已經(jīng)有一個(gè)復(fù)合要求的享元對象。如果已經(jīng)有了,享元工廠角色就應(yīng)當(dāng)提供這個(gè)已有的享元對象,如果系統(tǒng)中沒有一個(gè)適當(dāng)?shù)南碓獙ο蟮脑?#xff0c;享元工廠角色就應(yīng)當(dāng)創(chuàng)建一個(gè)合適的享元對象。 4.客戶端角色:本角色需要維護(hù)一個(gè)對所有享元對象的引用。本角色需要自行存儲(chǔ)所有享元對象的外蘊(yùn)狀態(tài)。 abstract class FlyWeight{public abstract void operation(); }class ConcrateFlyWeight extends FlyWeight {String str;public ConcrateFlyWeight(String str) {super();this.str = str;}@Overridepublic void operation() {// TODO Auto-generated method stubSystem.out.println("concrate fly " + str);} } 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(); } } View Code 享元模式應(yīng)當(dāng)在什么條件下使用? 當(dāng)以下所有條件都滿足時(shí),可以考慮使用享元模式 1.一個(gè)系統(tǒng)有大量的對象 2.這些對象的耗費(fèi)大量的內(nèi)存 3.這些對象的狀態(tài)中的大部分都可以外部化 4.這些對象可以按照內(nèi)蘊(yùn)狀態(tài)分成很多的組,當(dāng)把外蘊(yùn)對象從對象中剔除時(shí),每一個(gè)組都可以僅用一個(gè)對象替代 5.軟件系統(tǒng)不依賴于這些對象的身份,換言之,這些對象可以是不可分辨的。 最后,使用享元模式需要維護(hù)一個(gè)記錄了系統(tǒng)已有的所有享元對象的表,而這需要耗費(fèi)資源,因此,應(yīng)當(dāng)在有足夠多的享元實(shí)例可供共享時(shí)才值得使用享元模式。 優(yōu)缺點(diǎn): 1.享元模式使得系統(tǒng)更加復(fù)雜,為了使對象可以共享,需要將一些狀態(tài)外部化,這使得程序的邏輯復(fù)雜化 2.享元模式將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間稍微變長

轉(zhuǎn)載于:https://www.cnblogs.com/whesuanfa/p/7418735.html

總結(jié)

以上是生活随笔為你收集整理的享员模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。