設計模式__享元模式

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

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章