Java 实现享元(Flyweight)模式
/**
* 字母
* @author stone
*
*/
public class Letter { private String name; public Letter(String name) {
this.name = name;
} public String getName() {
return name;
}
}
/**
* 一个产生字母对象的 享元工厂(单例工厂)
* @author stone
*
*/
public class LetterFactory {
private Map<String, Letter> map;
private static LetterFactory instance = new LetterFactory(); private LetterFactory() {
map = new HashMap<String, Letter>();
} public static LetterFactory getInstance() {
return instance;
} public void add(Letter letter) {
if (letter != null && !map.containsKey(letter.getName())) {
map.put(letter.getName(), letter);
}
System.out.println("map.size====" + map.size());
} public Letter get(String name) {
return map.get(name);
} }
/*
* 享元(Flyweight)模式 结构型模式 主要目的是实现对象的共享
* 字面上看就是 一个 共享元件的模式,这里是将 一些在系统中须要反复使用的对象。共享成单个元件
*
* 像JDBC数据库连接池、线程池等 都是应用了享元模式
* 数据库连接池: 创建了一定数量的连接。存入池中。用到时取出。释放时再存入
* 池程池:相似,也是 用到时取出,释放时再存入
* 所以一般 都会有一个集合来存储元件。有一个享元工厂进行元件的管理。 */
public class Test {
public static void main(String[] args) {
LetterFactory factory = LetterFactory.getInstance();
String word = "easiness";
addLetterByName(factory, word); getLetter(factory, word);
}
//加入字母对象
static void addLetterByName(LetterFactory factory, String word) {
for (char c : word.toCharArray()) {
factory.add(new Letter(c + ""));
}
}
//输出字母对象
static void getLetter(LetterFactory factory, String word) {
for (char c : word.toCharArray()) {
System.out.println(factory.get(c + ""));
}
}
}
打印
map.size====1
map.size====2
map.size====2
map.size====3
map.size====4
map.size====5
map.size====5
flyweight.Letter@3343c8b3
flyweight.Letter@272d7a10
flyweight.Letter@3343c8b3
flyweight.Letter@1aa8c488
flyweight.Letter@3dfeca64
flyweight.Letter@22998b08
flyweight.Letter@1aa8c488
Java 实现享元(Flyweight)模式的更多相关文章
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- python 设计模式之享元(Flyweight)模式
#写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...
- 十一、结构模式之享元(Flyweight)模式
什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...
- 享元(FlyWeight)模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...
- 设计模式C++描述----12.享元(Flyweight)模式
一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...
- 【设计模式】Java设计模式 - 享元模式
Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- Java设计模式-享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构
- Java设计模式—享元模式
享元模式:是池技术的重要实现方式. 定义如下: 使用共享对象可有效地支持大量的细粒度的对象. 个人理解:享元模式利用共享对象的技术,解决了Java中内存溢出的问题. 享元模式的定义为我们提出了两个要求 ...
随机推荐
- poj 1088 滑雪(区间dp+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...
- JAVA中SSH面试问题
1.阐述struts2的执行流程. Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件.核心控制器Filter ...
- 如何开始一个模块化可扩展的Web App(转)
原文链接:http://avnpc.com/pages/start-a-modular-extensible-webapp 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性 ...
- nodejs学习笔记_nodejs和PHP在基础架构上的差别--共享状态的并发
绝大多数对于Node.js的讨论都把关注点放在了处理高并发能力上,做开发的时候一定要明确node内部做出的权衡,以及node应用性能好的原因. node 为javascript引入了一个复杂的概念,: ...
- android 支持分组和联系人展示的一个小样例
先看效果图: 要实现这个效果,activity必须实现ExpandableListActivity @Override public void onCreate(Bundle savedInstanc ...
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1) java中的返回值void和JNI中的void是完全对应的哦! ...
- iPhone APP 扫码下载
移动互联网发展迅速,各种APP的开发都太疯狂了,一般稍大点儿的应用,都会准备多个版本,比如:iPhone版.iPad版.Android版,我们姑且称之为:终端适配. 业务做的再大点儿的,APP还会考虑 ...
- 五毛的cocos2d-x学习笔记04-触摸点
Touch position是屏幕坐标系中的点,OpenGL position是cocos2d-x用到的OpenGL坐标系上的点坐标.所以就需要将touch的坐标转换成OpenGL坐标系中的点坐标. ...
- ACE6.2.0下载HTTP服务器文件
#include "ace/Log_Msg.h" // ACE_DEBUG的宏定义在这里.#include "ace/OS.h"#include "a ...
- js控制父子页面传值(iframe和window.open)
在html中,window对象代表浏览器中一个打开的窗口,就像我们C/S中做窗体一样,在该页的window对象就是new了一个新的窗体对象. 就像做C/S开发一样,浏览器是一个软件,每一个网页都是它n ...