设计模式总结篇系列:享元模式(Flyweight)
我们都知道,Java中的String类具有如下特性:String是一个不可变类,当直通过用字符串方式使用String对象时,Jvm实际上在内存中只存有一份,且存在字符串常量池中。当对字符串直接进行修改时(如直接联接另一个字符串常量),Jvm会首先去字符串常量池中查找是否已经存在此字符串,不存在则创建一份放在池中,存在则直接使用。诸如此类:当系统中可能具有多个相同的对象时,对于具有相同的内容的对象可以实现对象的共享,即共享池,以此避免不必要的相同对象的创建以减少系统内存的开销。称之为享元模式。
对于定义中的相同的对象,相同一词如何理解?首先我们需要解释下享元模式中的两个概念:内蕴状态和外蕴状态。
内蕴状态:享元对象内部的可以以此来作为区分是否是同一个对象的依据的属性。内蕴状态不随着外部环境的变化而变化。
外蕴模式:虽然也是享元对象的属性,但可以随着外部环境的变换而变化,同一享元对象在不同的地方其内部的外蕴状态可能不同。
享元模式一般的累定义过程如下:
1. 定义享元类的接口:
interface Flyweight{
// 用于改变外蕴状态
public void changeStat(String exState);
}
2.定义发具体的享元类:
class ConcreteFlyweight implements Flyweight {
//内蕴状态
private String innerState;
// 外蕴状态
private String exState;
public ConcreteFlyweight(String innerState) {
this.innerState = innerState;
}
@Override
public void changeStat(String exState) {
this.exState = exState;
}
}
3. 定义工厂类,用来管理享元对象:
class FlyweightFactory {
private static Map<String, Flyweight> flyweightMap = new HashMap<String, Flyweight>();
public static Flyweight getFlyweight(String innerState) {
Flyweight flyweight = flyweightMap.get(innerState);
if (flyweight == null) {
flyweight = new ConcreteFlyweight(innerState);
flyweightMap.put(innerState, flyweight);
}
return flyweight;
}
}
4. 客户端测试:
public class FlyweightTest {
public static void main(String[] args) {
Flyweight a = FlyweightFactory.getFlyweight("A");
a.changeStat("first-A");
Flyweight b = FlyweightFactory.getFlyweight("B");
b.changeStat("first-B");
Flyweight aa = FlyweightFactory.getFlyweight("A");
a.changeStat("second-A");
Flyweight bb = FlyweightFactory.getFlyweight("B");
b.changeStat("second-B");
System.out.println(a == aa); // true
System.out.println(b == bb); // true
}
}
通过最近的7篇文章大体上对Java设计模式中的七中结构型模式进行了总结,分别是:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。
设计模式总结篇系列:享元模式(Flyweight)的更多相关文章
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
- Java享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...
- 享元模式-Flyweight(Java实现)
享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...
- 享元模式/Flyweight模式/对象结构型/设计模式
flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...
随机推荐
- Vue-router重修01
---恢复内容开始--- 1.在vue中获取dom vue中不建议您亲自进行dom操作 vue实例内置ref属性存储或获取相应的dom元素 <div ref="dv"> ...
- 源码安装python +NGINX 的坎坷路 +uwsgi安装 部署django 的CRM项目
一.Nginx安装(基于ubuntu17.10 版本) 首先我们是基于源码安装,主要有如下步骤 1.安装依赖包 1.安装gcc g++的依赖库 sudo apt-get install build-e ...
- Pyinstaller (python打包为exe文件)
需求分析: python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速. 当然打包的脚本似乎不是在所有的win平台下都能使用,wi ...
- 关于实体类getset方法首字母小写问题
实体类:private Date cDateTime;private String cNickname; public Date getcDateTime() { return cDateTime;} ...
- 判断以xx开头的字符串
public static void main(String[] args) { String str = "EAN_13,1534651"; String strHttp = & ...
- storm集群架构
一.storm何许人也? Storm 是Twitter的一个开源框架.Storm一个分布式的.容错的实时计算系统,它被托管在GitHub上,遵循 Eclipse Public License 1.0. ...
- [Swift]LeetCode129. 求根到叶子节点数字之和 | Sum Root to Leaf Numbers
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- [Swift]LeetCode314. 二叉树的竖直遍历 $ Binary Tree Vertical Order Traversal
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- Linux中FTP远程传输,SSH远程连接,以及SCP远程拷贝
常用服务器ftp.ssh 1. Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于 ...
- git入门笔记汇总——(廖雪峰博客git入门)
本文内容是对廖雪峰老师Git教程做的笔记,外加一些自己的学习心得,还抱着学以致用的心态来实践一番 如有显示错误 请移步本人github:git教程小结 Git学习笔记 Git简介 安装Git 创建版本 ...