享元模式 Flyweight
Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。
把对象中使用比较多,具有共同点的,拿出来做成一个共享类,这样就行成了共享模式。
如:Integer 对象在-128~127 使用的是同一个对象。在这之间是共享的。
享元中的角色:
Flyweight: 抽象享元类。所有具体享元类的超类或者接口
ConcreteFlyweight: 具体享元类。指定内部状态,为内部状态增加存储空间。
UnsharedConcreteFlyweight: 非共享具体享元类。
FlyweightFactory: 享元工厂类。用来创建并管理Flyweight对象。
当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用的,如果有,factory只是简
单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象.
优点:
1、能够极大的减少系统中对象的个数。
2、内部状态在什么环境下都能被共享。
缺点:
由于需要区分外部状态和内部状态,使得程序在某种程度上更加复杂化了。
模式适用场景
如果一个系统中存在大量相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。
如何使用?
interface Flyweight
{
void operation();
}
class ConcreteFlyweight implements Flyweight { //共享的
private String s;
ConcreteFlyweight(String s)
{
this.s = s;
}
public void operation()
{
System.out.println("..........."+s);
}
}
//享元工厂
class FlyweightFactory {
//缓冲池
static Map<String,Flyweight> flyweights = new HashMap<String,Flyweight>();
FlyweightFactory() //缓冲区中放入初始值
{
flyweights.put("1",new ConcreteFlyweight("哈哈"));
flyweights.put("2",new ConcreteFlyweight("hehe"));
flyweights.put("3",new ConcreteFlyweight("嘿嘿"));
}
public Flyweight getFlyweights( String key ) {
//从缓冲池中取值
Flyweight f = flyweights.get(key);
if( f==null ){ //如果没有,则建立对象,并放入缓冲池中
f = new ConcreteFlyweight("内存里不存在这个数");
flyweights.put(key,f);
}
return f;
}
}