Java享元设计模式
定义
享元模式(Flyweight Pattern)是一种结构型设计模式,它的主要目的是减少内存使用和提高性能。它通过共享对象来减少内存使用,从而提高性能
对应角色
- 享元工厂:用于创建具体享元类,维护相同的享元对象。
- 抽象享元:定义需要共享的对象业务接口。
- 具体享元类:实现抽象享元类的接口,完成某一具体逻辑。
- 客户端:使用享元模式的组件,通过享元工厂取得享元对象
优缺点
优点
- 减少内存使用:通过共享对象来减少内存使用,从而提高性能¹。
- 降低对象数量:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力⁴。
缺点
- 增加系统复杂度:需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
应用场景
- 文字编辑器:当需要在文本编辑器中创建大量相似的字母或数字时,可以使用享元模式来共享相同的字母或数字对象,减少内存使用和对象创建的数量。
- 游戏中的角色:当需要在游戏中创建大量相似的角色时,可以使用享元模式来共享相同的角色对象,减少内存使用和对象创建的数量。
- Web应用中的缓存:当需要在Web应用中缓存大量相似的对象时,可以使用享元模式来共享相同的对象,减少内存使用和对象创建的数量。
- 数据库连接池:当需要在应用中管理大量数据库连接时,可以使用享元模式来共享相同的连接对象,减少内存使用和连接创建的数量
实例
import java.util.HashMap;
import java.util.Map;
interface Flyweight {
public void operation(String state);
}
class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
public void operation(String state) {
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + state);
}
}
class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
Flyweight flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
public class FlyweightPatternDemo {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("aa");
Flyweight flyweight2 = factory.getFlyweight("aa");
flyweight1.operation("x");
flyweight2.operation("y");
}
}