【设计模式】—— 享元模式Flyweight
前言:【模式总览】——————————by xingoo
模式意图
享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。
再比如餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具。

应用场景
1 一个系统应用到了大量的对象,而且很多都是重复的。
2 由于大量对象的使用,造成了存储效率上的开销。
3 对象的状态大多是外部状态,不干扰状态本身。
4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。
最近项目中就有这个使用场景,比如一些文件的图标,由于重复使用,完全可以采用这种模式,放入缓存中,以后每次调用直接从缓存中读取就行了。
模式结构

FlyweightFactorty 提供共享对象的工厂方法,里面含有一个聚集对象,一般都是用HashMap。通常这个工厂类都通过单例模式创建。
class FlyweightFactory{
private HashMap map = new HashMap();
public FlyweightFactory() {
}
public Flyweight factory(int state){
if(map.containsKey(state)){
return (Flyweight)map.get(state);
}else{
map.put(state, new ConcreteFlyweight(state));
return (Flyweight)map.get(state);
}
}
public void CheckMap(){
System.out.println("*****************************************");
int i=;
for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
Map.Entry e = (Map.Entry)it.next();
System.out.println("map.get("+(i++)+") : "+ e.getKey());
}
System.out.println("*****************************************");
}
}
Flyweight 共享对象的接口,描述统一标识
interface Flyweight{
public int getState();
}
ConcreteFlyweight 真正的具体实现类
class ConcreteFlyweight implements Flyweight{
private int state;
public ConcreteFlyweight(int state) {
this.state = state;
}
public int getState() {
return state;
}
}
全部代码
package com.xingoo.Flyweight; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; class FlyweightFactory{
private HashMap map = new HashMap(); public FlyweightFactory() {
} public Flyweight factory(int state){
if(map.containsKey(state)){
return (Flyweight)map.get(state);
}else{
map.put(state, new ConcreteFlyweight(state));
return (Flyweight)map.get(state);
}
} public void CheckMap(){
System.out.println("*****************************************");
int i=;
for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
Map.Entry e = (Map.Entry)it.next();
System.out.println("map.get("+(i++)+") : "+ e.getKey());
}
System.out.println("*****************************************");
}
}
interface Flyweight{
public int getState();
}
class ConcreteFlyweight implements Flyweight{
private int state;
public ConcreteFlyweight(int state) {
this.state = state;
}
public int getState() {
return state;
}
}
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
factory.factory();
factory.factory();
factory.factory();
factory.factory();
factory.factory();
factory.factory();
factory.CheckMap();
}
}
运行结果
*****************************************
map.get() :
map.get() :
map.get() :
map.get() :
*****************************************
【设计模式】—— 享元模式Flyweight的更多相关文章
- 设计模式-享元模式(FlyWeight)
一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...
- 设计模式--享元模式Flyweight(结构型)
一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...
- 大话设计模式--享元模式 Flyweight -- C++实现实例
1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...
- 深入浅出设计模式——享元模式(Flyweight Pattern)
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
随机推荐
- Android源代码下载以及异常查找网站推荐
源代码下载:https://github.com/ 异常查找:http://stackoverflow.com/
- 批量下载,多文件压缩打包zip下载
0.写在前面的话 图片批量下载,要求下载时集成为一个压缩包进行下载.从昨天下午折腾到现在,踩坑踩得莫名其妙,还是来唠唠,给自己留个印象的同时,也希望给需要用到这个方法的人带来一些帮助. 1.先叨叨IO ...
- Hadoop体系结构杂谈
hadoop体系结构杂谈 今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底 ...
- MiZ702学习笔记10——文本实例化IP的方法
之前,添加vivado自带IP的时候,都是以图形化的方式:一般是新建一个Block Design顶层文件,然后将图形化的ip贴到,Block Design中. 但是,在进行PL的开发过程中,有时不想使 ...
- python 带参数的多重继承
1. 不带参数的多重继承 # 作者:hhh5460 # 时间:2017.07.18 class A(object): def show_x(self): print('A') class B(obje ...
- java 调用 linux 命令行 +使用管道、awk等命令进行数据处理的方法
这里用 sh -c "命令" 的方式是因为java里只能这么用,管道这边java处理不了,所以只能一次执行一条命令,但是在linux里用 sh -c 的方式返回的awk处理过的结果 ...
- centos 7 git的管理和使用
一.linux 安装git (服务端) 1.首先创建用户账号 useradd zlx passwd zlx .... 2.创建目录git仓库 mkdir zlx_git.git 3.赋权限 chown ...
- Linux Socket 编程简介
在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...
- jmeter-如何在JDBC Request中添加多条语句执行
1.JDBC Connection Configuration中配置Database URL时在URL后面添加 ?allowMultiQueries=true 2.JDBC Request中添加语句 ...
- GTK学习笔记————创建窗口
创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...