享员模式
概述:
?????? 所謂享員模式就是運(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é)
- 上一篇: 源码安装zabbix3.2.7时PHP
- 下一篇: 3.栈