我们都知道,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)的更多相关文章

  1. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  2. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  4. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  5. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  6. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  7. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

  8. Java享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...

  9. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  10. 享元模式/Flyweight模式/对象结构型/设计模式

    flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...

随机推荐

  1. MySQL索引背后的数据结构及算法原理(转)

    转自:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  2. socket error:10053

    系统提示:10053,由于超时或其它失败,连接中止 服务端和客户端并没有出现连接错误或主动关闭连接 发生这个错误的原因往往是连接上了,但是长时间没有通信,所以连接被挂起了 防止的办法就是自己设计心跳包 ...

  3. 2.postman安装及使用

    一.postman说明 postman是研发和测试进行接口调试的工具.可以用来很方便的模拟get或者post或者其他方式的请求来调试接口. 二.postman安装 ①作为谷歌浏览器插件安装 参考资料: ...

  4. Tips_发送请求时添加一个随机数参数,让浏览器每次都重新发请求到服务器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. .Net Core 部署 CentOs7+Nginx

    先爆图 由于是初学者,部署出来这个界面也不容易,此前第一步弄了个这个出来 动态的没问题,然后静态资源死活就是不出来,弄了两个小时没有结果,带着遗憾睡了个觉 试验1: server { listen ; ...

  6. ionic4 开发企业微信应用0

    作为一个后台开发人员,几年前参与过Ionic1开发过一微信公众号的经历,所以这次开发企业微信应用,就使用了ionic,正好ionic4 rc版本发布,虽然不是正式版,作为本项目的项目经理,还是决定使用 ...

  7. TP框架下载功能

    namespace Home\Controller; use Think\Controller; use Org\Net\Http; class IndexController extends Con ...

  8. Java_循环

    遍历数组: 一个栗子: public class Test01 { public static void main(String[] args) { int[] aa = {19,92,12,03,4 ...

  9. ubuntu connect to windows folder share

    在windows上给远程登录的用户设置一个账号密码.”右击计算机图标“——"管理”——“本地用户和组”——“用户”.然后右击选择“新用户”,输入账号密码,并勾选“密码永不过期”,这样,在远程 ...

  10. json格式 (JavaScipt Object Notation)

    json格式 json语法规则: 01.对象表现形式 key:value 键值对 02.如果有多个数据,之间使用逗号隔开 k1:v1,k2:v2 03.把对象写在大括号中 var student={a ...