前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之享元模式(结构型)

设计模式之享元模式(结构型)

作者头像
SmileNicky
发布2019-01-17 16:19:07
2910
发布2019-01-17 16:19:07
举报
文章被收录于专栏:Nicky's blogNicky's blog

模式定义

享元模式(Flyweight Pattern)就是通过共享技术实现大量细粒度对象的复用。享元模式是通过细粒度对象的共享,所以也可以说享元模式是一种轻量级模式。按照Gof模式分类,享元模式属于对象结构型模式。

模式解释

  • 可以共享的内容称为内部状态(Intrinsic State),需要外部环境设置的不能共享的内容称为外部状态(Extrinsic State)。享元模式需要创建一个享元工厂负责维护享元池(Flyweight Pool),享元池用于存储具有相同内部状态的享元对象。
  • 享元模式中共享的仅仅是享元对象,外部状态是需要通过环境类设置的,在实际使用中,能共享的内部状态不是很多的,所以设计享元对象是比较小的,也就是细粒度对象,所以说享元模式就是通过共享技术实现大量细粒度对象的复用
  • 创建大量对象会一定程度影响系统性能,不方便程序阅读,使用享元模式可以减少对象使用。

模式角色

享元模式包括下面角色

  • Flyweight:抽象享元类
  • ConcreteFlyweight:具体享元类
  • UnsharedConcreteFlyweight:非分享具体享元类
  • FlyweightFactory:享元工厂类

享元模式的核心在享元工厂类,享元工厂类的作用在与维护享元池,需要什么对象,可以从享元池获取

典型例子

例子来自:《设计模式》一书

public class Flyweight
{
        //内部状态作为成员属性
	private String intrinsicState;
	
	public Flyweight(String intrinsicState)
	{
		this.intrinsicState = intrinsicState;
	}
	
	public void operation(String extrinsicState)
	{
		......
	}	
}
public class FlyweightFactory
{
	private HashMap flyweights = new HashMap();
	
	public Flyweight getFlyweight(String key)
	{
		if(flyweights.containsKey(key))
		{
		   //享元池有对象,直接获取
			return (Flyweight)flyweights.get(key);
		}
		else
		{
		    //创建具体的享元对象,存储在享元池
			Flyweight fw = new ConcreteFlyweight();
			flyweights.put(key,fw);
			return fw;
		}
	}
} 

模式应用

  • JDK类库中的String类使用了享元模式 …

模式分类

享元模式分为单存享元模式和复合享元模式

  • 单纯享元模式:在单纯享元模式中不存在非共享具体单元,所有的具体享元类对象都是可以共享的。
  • 复合享元模式:通过复合模式将单纯享元模式进行组合,形成复合享元对象

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2cpd3xm4n1q8s

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模式定义
  • 模式解释
  • 模式角色
  • 典型例子
  • 模式应用
  • 模式分类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档