享元模式(Flyweight)揪阶,運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象缠捌。
適用場(chǎng)景
- 如果一個(gè)系統(tǒng)中存在大量的相同或者相似的對(duì)象宙刘,由于這類(lèi)對(duì)象的大量使用苍姜,會(huì)造成系統(tǒng)內(nèi)存的耗費(fèi),可以使用享元模式來(lái)減少系統(tǒng)中對(duì)象的數(shù)量悬包。
- 對(duì)象的大部分狀態(tài)都可以外部化衙猪,可以將這些外部狀態(tài)傳入對(duì)象中。
優(yōu)點(diǎn)
- 享元模式的優(yōu)點(diǎn)在于它能夠極大的減少系統(tǒng)中對(duì)象的個(gè)數(shù)
- 享元模式由于使用了外部狀態(tài)布近,外部狀態(tài)相對(duì)獨(dú)立垫释,不會(huì)影響到內(nèi)部狀態(tài),所以享元模式使得享元對(duì)象能夠在不同的環(huán)境被共享
缺點(diǎn)
- 由于享元模式需要區(qū)分外部狀態(tài)和內(nèi)部狀態(tài)撑瞧,使得應(yīng)用程序在某種程度上來(lái)說(shuō)更加復(fù)雜化了
- 為了使對(duì)象可以共享棵譬,享元模式需要將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間變長(zhǎng)
UML結(jié)構(gòu)圖
]
源碼
享元類(lèi)的接口
public interface Flyweight {
public void operation(int id);
}
具體共享類(lèi)
public class ConcreteFlyweight implements Flyweight {
@Override
public void operation(int id) {
System.out.println("具體Flyweight : " + id);
}
}
不需要共享的享元具體實(shí)現(xiàn)類(lèi)
public class UnsharedConcreteFlyweight implements Flyweight {
@Override
public void operation(int id) {
System.out.println("不共享的具體Flyweight : " + id);
}
}
享元工廠预伺,用來(lái)創(chuàng)建并管理Flyweight對(duì)象订咸。
public class FlyweightFactory {
private HashMap<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
public FlyweightFactory() {
flyweights.put("X", new ConcreteFlyweight());
flyweights.put("Y", new ConcreteFlyweight());
flyweights.put("Z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key) {
return flyweights.get(key);
}
}
客戶(hù)端調(diào)用
public class Client {
public static void main(String[] args) {
int id = 20;
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fx = flyweightFactory.getFlyweight("X");
fx.operation(--id);
Flyweight fy = flyweightFactory.getFlyweight("Y");
fy.operation(--id);
Flyweight fz = flyweightFactory.getFlyweight("Z");
fz.operation(--id);
UnsharedConcreteFlyweight unsharedConcreteFlyweight = new UnsharedConcreteFlyweight();
unsharedConcreteFlyweight.operation(--id);
}
}
設(shè)計(jì)模式系列:
創(chuàng)建型 | 結(jié)構(gòu)型 | 行為型 |
---|---|---|
工廠方法 簡(jiǎn)單工廠 抽象工廠 建造者模式 單例模式 原型模式 |
組合模式 外觀模式 橋接模式 代理模式 享元模式 適配器模式 裝飾模式 |
策略模式 模板方法 狀態(tài)模式 觀察者模式 備忘錄模式 迭代器模式 命令模式 職責(zé)鏈模式 解釋器模式 訪問(wèn)者模式 中介者模式 |