设计模式讲解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 ...
随机推荐
- 最初步的.NET MvcApi + Vue 前后端分离IIS部署
一.完成项目,各个项目部署在IIS上 1.前端项目部署 完成项目后在控制台npm run build 生成了dist文件夹 主要是部署这个文件夹 打开IIS 和部署AspNet MVC项目一 ...
- 014、Java中byte自动转型的操作
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- synchronized原理及优化,(自旋锁,锁消除,锁粗化,偏向锁,轻量级锁)
偏向锁:不占用CPU自旋锁:占用CPU.代码执行成本比较低且线程数少时,可以使用 .不经过OS.内核态,效率偏低 理解Java对象头与Monitor 在JVM中,对象在内存中的布局分为三块区域:对象头 ...
- 用四种方法将两个AJAX改为同步
用四种方法将两个AJAX改为同步 Promise.Generator函数.yield.async/await 相关 今有一题,题目为: 现有ajax1()和ajax2(),用于快速初始化CODE1和C ...
- error LNK2019: 无法解析的外部符号……
在VS中开发程序的时候遇到一个问题,应该算是比较常见,所以记录下. 在编译程序的时候遇到一个错误,大致提示如下: "error LNK2019: 无法解析的外部符号--" 遇到这个 ...
- 提交作业 C语言I作业11
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 http://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/10127 我在这个课程的目标 ...
- [转载]SQL Server 数据库定时自动备份
推荐使用SQLserver自带的SSMS工具创建维护计划来实现数据库定时自动备份 “维护计划”是在SSMS的对象资源管理中“管理”节点下面.使用维护计划可以通过可视化的操作,只点点鼠标就可以创建数据库 ...
- 026-PHP常用字符串函数(三)
<?php //颠倒字串 print("abcdefg 颠倒 "); print(strrev("abcdefg")."<hr>&q ...
- ubuntu12.04安装JDK8
系统里已经有jdk1.6,下载并解压jdk后,按照网上的教程(bash.bashrc)没成功. sudo update-alternatives --install /usr/bin/java jav ...
- Spark笔记(一)
简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapR ...