码迷,mamicode.com
首页 > 其他好文 > 详细

享元模式

时间:2016-05-15 21:35:23      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

享元模式是池技术的重要实现方式,其定义如下:
Use sharing to support large numbers of fine-grained objects efficiency.
使用共享对象可有效的支持大量的细粒度的对象
享元模式的定义为我们提出了两个要求:细粒度的对象和共享对象
细粒度对象使用的数量多且性质相近,那么就需要将这些对象的信息分为两个部分:内部状态(intrinsic)和外部状态(extrinsic)
内部状态:就是对象中可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变
外部状态:就是对象得以依赖的一个标记,是随环境改变而改变的,不可以共享的状态

技术分享

享元模式角色:
Flyweight抽象享元角色:就是一个产品的抽象类,同事定义出对象的外部状态和内部状态的接口或实现
ConcreteFlyweight具体享元角色:具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与
环境无关,不应该出现一个操作改变了内部状态。同事修改了外部状态
unsharedConcreteFlyweight不可共享的享元角色:不存在外部状态或安全要求(如线程安全)不能够使用共享技术的对象,该对象
一般不会出现在享元工厂中。
FlyweightFactory享元工厂:职责非常简单就是构造一个池容器,同时提供从池中获得对象的方法

//抽象享元角色
public abstract class Flyweight{
	//内部状态
	private String intrinsic;
	//外部状态
	private final String Extrinsic;  //将外部状态定义为final,是为了防止意外产生,防止无意中修改导致池混乱
	/*
		注意:在程序开发中,确认只需要一次赋值的属性则设置为final类型,避免无意修改导致逻辑混乱,特别是Session
		级的常量或变量
	*/
	//要求享元角色必须接受外部状态
	public Flyweight(String _extrinsic){
		this.Extrinsic=_extrinsic;
	}
	//定义业务操作
	public abstract void operate();
	//内部状体的getter/setter
	public String getIntrinsic(){
		return intrinsic;
	}
	public void setIntrinsic(String intrinsic){
		this.intrinsic=intrinsic;
	}
}

//具体享元角色
public class ConcreteFlyweight1 extends Flyweight{
	//接受外部状态
	public ConcreteFlyweight1(String _extrinsic){
		super(_extrinsic);
	}
	//根据外部状体进行逻辑处理
	public void operate(){
	
	}
}
public class ConcreteFlyweight2 extends Flyweight{
	//接受外部状态
	public ConcreteFlyweight2(String _extrinsic){
		super(_extrinsic);
	}
	//根据外部状体进行逻辑处理
	public void operate(){
	
	}
}

//享元工厂
public class FlyweightFactory{
	//定义一个池容量
	private static HashMap<String,Flyweight> pool=new HashMap<String,Flyweight>();
	//享元工厂
	public static Flyweight getFlyweight(String extrinsic){
		//需要返回的对象
		Flyweight flyweight=null;
		//在池中没有该对象
		if(pool.containKey(extrinsic)){
			flyweight=pool.get(extrinsic);
		}else{
			//根据外部状态创建享元对象
			flyweight=new ConcreteFlyweight1(extrinsic);
			//放置到池中
			pool.put(extrinsic,flyweight);
		}
		return flyweight;
	}
}

  

享元模式的优点和缺点:
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存占用,增强程序的性能,但它同时也提高
了系统复杂性,需要分离外部状体和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变。否则导致系统的逻辑混乱

使用场景:
1.系统中存在大量的相似对象
2.细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
3.需要缓冲池的场景

享元模式

标签:

原文地址:http://www.cnblogs.com/liaojie970/p/5496082.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!