设计模式之享元模式

享元模式的定义

运用共享技术有效的支持大量细粒度的对象。

享元模式的定义只有这一句,它是池技术的重要实现方式,重点在于细粒度和共享。

举个栗子

享元模式包含四种角色,两种状态,我们把可以共享的信息,和环境无关的部分称为内部状态,反之为外部状态,四种角色为抽象享元角色、具体享元角色、不可共享的享元角色、享元工厂,编码如下

  • 抽象享元角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public abstract class Flyweight {
//内部状态
private String intrinsic;
//外部状态
protected final String extrinsic;
protected Flyweight(String extrinsic) {
this.extrinsic = extrinsic;
}
public abstract void operate();
public String getIntrinsic() {
return intrinsic;
}
public void setIntrinsic(String intrinsic) {
this.intrinsic = intrinsic;
}
}
  • 具体享元角色
1
2
3
4
5
6
7
8
9
public class ConcreteFlyweight extends Flyweight {
protected ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}
@Override
public void operate() {
//实现业务
}
}
  • 享元工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class FlyweightFactory {
//池容器
private static HashMap<String,Flyweight> pool=new HashMap<>();
//享元工厂
public static Flyweight getFlyweight(String extrinsic){
Flyweight flyweight=null;
if (pool.containsKey(extrinsic)){
flyweight=pool.get(extrinsic);
}else {
flyweight=new ConcreteFlyweight(extrinsic);
pool.put(extrinsic,flyweight);
}
return flyweight;
}
}

以上就实现了一个享元模式,还是很容易理解的,享元模式的特点就是实现资源共享,重复利用。

适用范围

享元模式适用于在系统中存在大量的相似的对象,他们的内部状态与外部环境无关,而重复的创建和销毁会带来极大地资源浪费,使用享元模式可以增加一个缓冲池,能够降低系统开销。

优点缺点

享元模式的优点能减少对象创建,降低内存占用,提高程序性能。

享元模式的缺点是内外状态的分离增加了开发的难度,程序变复杂。

注意事项

享元模式要注意多线程下的安全问题,这个问题也是很常见的,需要注意。

另一个要注意的就是外部状态尽量使用java基本数据类型,否则会造成运行效率低的问题。

享元模式在java设计中非常常见,数据库连接池,线程池等等,是一种非常实用的设计模式。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!