模式定義
享元模式(Flyweight Pattern)就是通過共享技術(shù)實現(xiàn)大量細(xì)粒度對象的復(fù)用计寇。享元模式是通過細(xì)粒度對象的共享,所以也可以說享元模式是一種輕量級模式桑寨。按照Gof模式分類,享元模式屬于對象結(jié)構(gòu)型模式。
模式解釋
可以共享的內(nèi)容稱為內(nèi)部狀態(tài)(Intrinsic State)猜憎,需要外部環(huán)境設(shè)置的不能共享的內(nèi)容稱為外部狀態(tài)(Extrinsic State)。享元模式需要創(chuàng)建一個享元工廠負(fù)責(zé)維護(hù)享元池(Flyweight Pool)搔课,享元池用于存儲具有相同內(nèi)部狀態(tài)的享元對象胰柑。
享元模式中共享的僅僅是享元對象,外部狀態(tài)是需要通過環(huán)境類設(shè)置的,在實際使用中柬讨,能共享的內(nèi)部狀態(tài)不是很多的崩瓤,所以設(shè)計享元對象是比較小的,也就是細(xì)粒度對象踩官,所以說****享元模式就是通過共享技術(shù)實現(xiàn)大量細(xì)粒度對象的復(fù)用****
創(chuàng)建大量對象會一定程度影響系統(tǒng)性能却桶,不方便程序閱讀,使用享元模式可以減少對象使用蔗牡。
模式角色
享元模式包括下面角色
Flyweight:抽象享元類
ConcreteFlyweight:具體享元類
UnsharedConcreteFlyweight:非分享具體享元類
FlyweightFactory:享元工廠類
享元模式的核心在享元工廠類颖系,享元工廠類的作用在與維護(hù)享元池,需要什么對象辩越,可以從享元池獲取
典型例子
例子來自:《設(shè)計模式》一書
public class Flyweight
{
//內(nèi)部狀態(tài)作為成員屬性
private String intrinsicState;
public Flyweight(String intrinsicState)
{
this.intrinsicState = intrinsicState;
}
public void operation(String extrinsicState)
{
......
}
}
public class FlyweightFactory
{
private HashMap flyweights = new HashMap();
public Flyweight getFlyweight(String key)
{
if(flyweights.containsKey(key))
{
//享元池有對象嘁扼,直接獲取
return (Flyweight)flyweights.get(key);
}
else
{
//創(chuàng)建具體的享元對象,存儲在享元池
Flyweight fw = new ConcreteFlyweight();
flyweights.put(key,fw);
return fw;
}
}
}
模式應(yīng)用
- JDK類庫中的String類使用了享元模式
...
模式分類
享元模式分為單存享元模式和復(fù)合享元模式
- 單純享元模式:在單純享元模式中不存在非共享具體單元黔攒,所有的具體享元類對象都是可以共享的趁啸。
- 復(fù)合享元模式:通過復(fù)合模式將單純享元模式進(jìn)行組合,形成復(fù)合享元對象