声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635

FlyWeight模式即享元模式。很多文本编辑器中都使用了FlyWeight模式。FlyWeight单词含义为轻量级的。该模式主要是使得大量对象可以共享某些元素,从而减少内存使用。比如文本编辑器中每个文字都会有字体属性,如果给每个文字的字体属性都分配一个对象,那对内存的消耗就太大了。此时享元模式就派上用场了。享元模式也是一种具体的“池化”技术。

享元操作接口
package com.designpattern.flyweight;

/**
* 字体享元接口
*/
public interface FontFlyWeight
{
void setFont(String color, int size); void getFont();
}

具体享元
package com.designpattern.flyweight;

public class SharedConcreteFontFlyWeight implements FontFlyWeight
{
private String color;
private int size;
private String str;

public SharedConcreteFontFlyWeight(String str)
{
this.str = str;
} public void setFont(String color, int size)
{
this.color = color;
this.size = size;
} public void getFont()
{
System.out.println("str:" + str + ", color:" + color + ",size:" + size);
}

}

享元工厂

package com.designpattern.flyweight;

import java.util.Hashtable;

public class FontFactory
{
//HashTable存放的就是可以复用的享元
private Hashtable flyWeights = new Hashtable(); public FontFlyWeight getFlyWeight(String str)
{
if (flyWeights.get(str) != null)
{
return (FontFlyWeight) flyWeights.get(str);
}
else
{
FontFlyWeight tmp = new SharedConcreteFontFlyWeight(str);
flyWeights.put(str, tmp);
return tmp;
}
} public Hashtable getFactory()
{
return flyWeights;
}
}

测试类(客户端)

package com.designpattern.flyweight;

import java.util.Hashtable;

public class TestFlyWeight
{
public static void main(String[] args)
{
int[] size = {1, 2, 3, 4, 5};
String[] color = {“000000”, “111111”, “222222”, “333333”, “555555”};
FontFactory fontFactory = new FontFactory();
String str = “算法导论”;
int flyWeightIndex;
int flyWeightNum = color.length; //or size.length
for (int i = 0; i < str.length(); i++)
{
//这个规则是自己任意定的
flyWeightIndex = i / flyWeightNum;
fontFactory.getFlyWeight(str.substring(i, i + 1)).setFont(
color[flyWeightIndex], size[flyWeightIndex]);
}

    //打印出所有享元
Hashtable flyWeights = fontFactory.getFactory();
FontFlyWeight fontFlyWeight;
for (int i = 0; i < str.length(); i++)
{
fontFlyWeight = (FontFlyWeight) flyWeights.get(str.substring(i, i + 1));
fontFlyWeight.getFont();
System.out.println(System.identityHashCode(fontFlyWeight));
} //创建另一个文本对象,观察其对享元的复用
System.out.println("\n测试享元复用");
String str2 = "算法入门";
for (int i = 0; i < str2.length(); i++)
{
//这个规则是自己任意定的
flyWeightIndex = i / flyWeightNum;
fontFactory.getFlyWeight(str2.substring(i, i + 1)).setFont(
color[flyWeightIndex], size[flyWeightIndex]);
}
for (int i = 0; i < str2.length(); i++)
{
fontFlyWeight = (FontFlyWeight) flyWeights.get(str2.substring(i, i + 1));
fontFlyWeight.getFont();
System.out.println(System.identityHashCode(fontFlyWeight));
}
}

}

运行结果

str:算, color:000000,size:1
356573597
str:法, color:000000,size:1
1735600054
str:导, color:000000,size:1
21685669
str:论, color:000000,size:1
2133927002 测试享元复用
str:算, color:000000,size:1
356573597
str:法, color:000000,size:1
1735600054
str:入, color:000000,size:1
1836019240
str:门, color:000000,size:1
325040804

可以看到,“算”、“法”两个文字对应的享元被复用了。节约了内存开销。

设计模式讲解5:FlyWeight模式源码的更多相关文章

  1. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  2. 设计模式讲解4:Bridge模式源码

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 桥接模式可以和排列组合关联起来理解,一个对象有多种不通种类的属性,如attributeA1,attribu ...

  3. 设计模式课程 设计模式精讲 7-3 建造者模式源码解析(jdk+guava+spring+mybaties)

    1 源码解析 1.1 jdk解析 1.2 guava解析 1.3 spring解析 1.4 mybaties解析 1 源码解析 1.1 jdk解析 String public StringBuilde ...

  4. 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦

    本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...

  5. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  6. 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析

    前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...

  7. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

  8. Android Doze模式源码分析

    科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...

  9. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

随机推荐

  1. 在xampp下安装thinkphp5

    在xampp2016下安装thinkphp5 (本人的坑,说白了就是把thinkphp5的文件放到htdocs下) 1.把该xampp中的php文件夹路径设置进环境变量,这样才能全局运行compose ...

  2. 二、Vue组件(component):组件的相互引用、通过props实现父子组件互传值

    一.组件各部分说明及互相引用 1.一个vue组件由三个部分组成 Template 只能存在一个根元素 2.Script 3.Style scoped:样式只在当前组件内生效 1.1 组件的基本引用代码 ...

  3. 吴裕雄--天生自然java开发常用类库学习笔记:SortedMap类

    import java.util.Map ; import java.util.SortedMap ; import java.util.TreeMap ; public class SortedMa ...

  4. LCD驱动详解

    参考文档:<液晶屏.pdf><S3C2440用户手册><JZ2440-V3原理图>   frame buffer: 显存,用于存放LCD显示数据:frame buf ...

  5. IDEA启动Tomcat报错Address localhost:1099 is already in use解决办法

    问题:Error running 'lugia-web': Address loaclhost:1099 is already in use如下图 解决方法:cmd输入下面命令: netstat -a ...

  6. mybatis插入数据后将其ID返回

    背景 mybatis没有关联保存的功能,所以主从表需要分开保存,这就涉及到主表保存后要再次获取主表ID的环节,以下介绍mybatis插入数据后返回其自增ID的两种方式 方案 1.sql获取 <i ...

  7. EditText监听器------实时监听

    前言: 在Android开发中EditText的使用频率还是挺高的,比如登录界面输入密码验证码等,有的时候要求我们要在输入号码后显示是哪家公司的,比如中国移动,中国联通,这是就会用到EditText监 ...

  8. 洛谷训练场——简单模拟 排座位(P1056)

    题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳. 同 ...

  9. MongoDB 常用查询语法

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  10. Inception SQL审核注解

    Inception SQL审核注解 1.建表语句 建表语句检查项 表属性的检查项 这个表不存在 对于create table like,会检查like的老表是不是存在. 对于create table ...