享元模式 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;
}
}