设计模式讲解5:FlyWeight模式源码
声明:迁移自本人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模式源码的更多相关文章
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
- 设计模式讲解4:Bridge模式源码
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 桥接模式可以和排列组合关联起来理解,一个对象有多种不通种类的属性,如attributeA1,attribu ...
- 设计模式课程 设计模式精讲 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 ...
- 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦
本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析
前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...
- ACE - Reactor模式源码剖析及具体实现(大量源码慎入)
原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...
- Android Doze模式源码分析
科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...
- Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析
一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...
随机推荐
- PHP mb_substr mbstring 函数
定义和用法 mb_substr - 获取部分字符串 版本支持 PHP4 PHP5 PHP7 支持 支持 支持 5.4.8 length 传入 NULL,则从 start 提取到字符串的结尾处. 在之前 ...
- Install and Configure NFS Server on RHEL 8 / CentOS 8
https://computingforgeeks.com/install-and-configure-nfs-server-on-centos-rhel/
- 安装phpmyadmin数据可视化
1.下载压缩包,并且解压 cd /usr/local/src wget https://files.phpmyadmin.net/phpMyAdmin/4.9.4/phpMyAdmin-4.9.4-a ...
- RadioGroup的使用
前言: 使用RadioGroup就可以在选择情况多的时候,简化代码 RadioGroup 使用互斥选择时,会使用RadioGroup标签下面RadioButton,如下面的代码:(这样写下来,男和女的 ...
- 读取docx表格中的信息
参考了 http://blog.csdn.net/qq_34475777/article/details/62055523 http://www.cnblogs.com/deepwaterplan/a ...
- Centos 时间与主机时间不匹配问题解决
有时候新安装的虚拟机的系统时间会和主机的时间差8个小时,这是因为虚拟机和主机所在的时区不同. 这会导致当你往mysql数据库插入数据时如果设置时间为current_time结果会和虚拟机保持一致. 1 ...
- Golang modules包依赖管理工具
初始化 执行go mod init module-name,其中module-name为包名字,执行完后会生成go.mod文件,如下 module module-name go 1.13 包管理 使 ...
- 使用docker快速体验kali linux
环境 运行在 64位 机器 企业版的 win10 系统 下载镜像 首先搜索docker download 去官网下载docker:https://www.docker.com/products/doc ...
- axios实现类似form传值的格式,以及实现拦截器功能,response拦截实现权限判断
import axios from 'axios' import Qs from 'qs' // 超时设置 const service = axios.create({ transformReques ...
- Codeforces Round #616 (Div. 2)
地址:http://codeforces.com/contest/1291 A题就不写解析了,就是给一个数,是不是本身满足这个条件或者删除某些数字来达到这个条件:奇数,各个位上的数字加起来是偶数. # ...