设计模式__享元模式

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

 


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