博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
轻量级
阅读量:5930 次
发布时间:2019-06-19

本文共 1544 字,大约阅读时间需要 5 分钟。

1、Schema定义

轻量级(Flyweight Pattern):使用共享来支持大量细粒度的对象重用。

仅使用一个小数目的对象系统。这些对象是非常相似。状态变化非常小,对象可以多次重复使用。由于享元模式要求可共享的对象必须是细粒度的对象,称为轻量级模式,它是一种对象结构型模式。

2、模式结构

享元模式包括例如以下角色:
Flyweight: 抽象享元类
ConcreteFlyweight: 详细享元类
UnsharedConcreteFlyweight: 非共享详细享元类
FlyweightFactory: 享元工厂类
3、模式分析
享元模式是一个考虑系统性能的设计模式,通过使用享元模式能够节约内存空间,提高系统的性能。

 

享元模式的核心在于享元工厂类。享元工厂类的作用在于提供一个用于存储享元对象的享元池。用户须要对象时,首先从享元池中获取,假设享元池中不存在。则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

 

典型的享元工厂类代码:

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;		}	}}
享元模式以共享的方式高效地支持大量的细粒度对象,享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。

 

(1) 内部状态是存储在享元对象内部而且不会随环境改变而改变的状态,因此内部状态能够共享。 
(2) 外部状态是随环境改变而改变的、不能够共享的状态。享元对象的外部状态必须由client保存,并在享元对象被创建之后。在须要使用的时候再传入到享元对象内部。一个外部状态与还有一个外部状态之间是相互独立的。 

典型的享元类代码:

public class Flyweight{        //内部状态作为成员属性	private String intrinsicState;		public Flyweight(String intrinsicState)	{		this.intrinsicState = intrinsicState;	}		public void operation(String extrinsicState)	{		......	}	}
4、模式优缺点
享元模式的长处
享元模式的长处在于它能够极大降低内存中对象的数量。使得同样对象或相似对象在内存中仅仅保存一份。
享元模式的外部状态相对独立,并且不会影响其内部状态。从而使得享元对象能够在不同的环境中被共享。

享元模式的缺点

享元模式使得系统更加复杂。须要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
为了使对象能够共享,享元模式须要将享元对象的状态外部化,而读取外部状态使得执行时间变长。

5、模式适用环境

在下面情况下能够使用享Metapatterns:
一种系统,具有大量的相同或似对象。因为大量使用这样的对象的,内存密集型事业。
物体的状态最能具体化。国家可以通过这些外部对象。

使用飞锤飞锤需要保持存储对象飞锤池,这需要耗费资源的,因此,它应该只被反复使用飞锤对象值你必须使用飞锤。

转载地址:http://zsktx.baihongyu.com/

你可能感兴趣的文章
第四章 容器
查看>>
HDS:转型关键还是私有云
查看>>
《遭遇外星人》读书笔记
查看>>
我的友情链接
查看>>
nmap常用选项
查看>>
SCSM常见报错解答
查看>>
SCDPM2012功能测试(5)—保护Exchange
查看>>
Python中的编码问题
查看>>
LoadRunner使用odbc时报错can't get hostname for your address的解决方法
查看>>
php加载zlib扩展
查看>>
刘宇凡:换个角度谈域名选择
查看>>
C# Socket通信改进记录
查看>>
Node.js 初识1
查看>>
linux下安装压缩解压程序7z命令及7z命令的使用
查看>>
容器技术介绍
查看>>
CCF NOI1069
查看>>
laravel5验证码
查看>>
Mac react环境搭建
查看>>
[Cpp primer] Namespace using Declarations
查看>>
图(个人复习专用)
查看>>