享员模式
概述:
?????? 所謂享員模式就是運用共享技術有效地支持大量細粒度對象的復用,Java語言中String類型就使用了享元模式。String對象是不變對象,一旦創建出來就不能改變。在jvm內部,String對象是共享的,如果一個系統有兩個String對象所包含字符串相同的話,jvm實際只創建一個string對象提供給兩個引用,從而實現string對象的共享。
????? 共享模式支持大量細粒度對象的復用。
????? 內部狀態:在享元對象內部不隨外部環境改變而變化的共享部分。
?????? 外部狀態:隨著環境的改變而改變,不能夠共享的狀態就是外部狀態。
由于享元模式區分了內部狀態和外部狀態,所以我們可以通過設置不同的外部狀態使得相同的對象可以具備一些不同的特性,而內部狀態設置為相同部分。
?????
抽象享元角色:具體享元類的超類,那些需要外蘊狀態的操作可以調用商業方法以參數形式傳入。
具體享元角色:實現抽象享元角色所規定的接口,如果有內蘊狀態的話,必須負責為內蘊狀態提供存儲空間,享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在系統內共享的。
3.享元工廠角色:本角色負責創建和管理享元角色。本角色必須保證享元對象可以被系統適當地共享。當一個客戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否已經有一個復合要求的享元對象。如果已經有了,享元工廠角色就應當提供這個已有的享元對象,如果系統中沒有一個適當的享元對象的話,享元工廠角色就應當創建一個合適的享元對象。 4.客戶端角色:本角色需要維護一個對所有享元對象的引用。本角色需要自行存儲所有享元對象的外蘊狀態。 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 //產生新的ConcreteFlyweight flyweight = new ConcreteFlyweight((String)obj); flyweights.put(obj, flyweight);//--------------------------------------5 } return flyweight;//---------------------------------------------------------6 } public int getFlyweightSize(){ return flyweights.size(); } } View Code 享元模式應當在什么條件下使用? 當以下所有條件都滿足時,可以考慮使用享元模式 1.一個系統有大量的對象 2.這些對象的耗費大量的內存 3.這些對象的狀態中的大部分都可以外部化 4.這些對象可以按照內蘊狀態分成很多的組,當把外蘊對象從對象中剔除時,每一個組都可以僅用一個對象替代 5.軟件系統不依賴于這些對象的身份,換言之,這些對象可以是不可分辨的。 最后,使用享元模式需要維護一個記錄了系統已有的所有享元對象的表,而這需要耗費資源,因此,應當在有足夠多的享元實例可供共享時才值得使用享元模式。 優缺點: 1.享元模式使得系統更加復雜,為了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯復雜化 2.享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長轉載于:https://www.cnblogs.com/whesuanfa/p/7418735.html
總結
- 上一篇: 源码安装zabbix3.2.7时PHP
- 下一篇: 3.栈