【设计模式】—— 享元模式Flyweight
时间:2022-04-22
本文章向大家介绍【设计模式】—— 享元模式Flyweight,主要内容包括模式意图、应用场景、模式结构、全部代码、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模式意图
享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。
再比如餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具。
应用场景
1 一个系统应用到了大量的对象,而且很多都是重复的。
2 由于大量对象的使用,造成了存储效率上的开销。
3 对象的状态大多是外部状态,不干扰状态本身。
4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。
最近项目中就有这个使用场景,比如一些文件的图标,由于重复使用,完全可以采用这种模式,放入缓存中,以后每次调用直接从缓存中读取就行了。
模式结构
FlyweightFactorty 提供共享对象的工厂方法,里面含有一个聚集对象,一般都是用HashMap。通常这个工厂类都通过单例模式创建。
1 class FlyweightFactory{
2 private HashMap map = new HashMap();
3
4 public FlyweightFactory() {
5 }
6
7 public Flyweight factory(int state){
8 if(map.containsKey(state)){
9 return (Flyweight)map.get(state);
10 }else{
11 map.put(state, new ConcreteFlyweight(state));
12 return (Flyweight)map.get(state);
13 }
14 }
15
16 public void CheckMap(){
17 System.out.println("*****************************************");
18 int i=0;
19 for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
20 Map.Entry e = (Map.Entry)it.next();
21 System.out.println("map.get("+(i++)+") : "+ e.getKey());
22 }
23 System.out.println("*****************************************");
24 }
25 }
Flyweight 共享对象的接口,描述统一标识
1 interface Flyweight{
2 public int getState();
3 }
ConcreteFlyweight 真正的具体实现类
1 class ConcreteFlyweight implements Flyweight{
2 private int state;
3 public ConcreteFlyweight(int state) {
4 this.state = state;
5 }
6 public int getState() {
7 return state;
8 }
9 }
全部代码
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=0;
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(4);
factory.factory(2);
factory.factory(2);
factory.factory(1);
factory.factory(1);
factory.factory(3);
factory.CheckMap();
}
}
运行结果
*****************************************
map.get(0) : 1
map.get(1) : 2
map.get(2) : 3
map.get(3) : 4
*****************************************
- P05_kafka_2.9.2-0.8.1集群搭建
- 再探matplotlib
- 分布式系统(Distributed System)资料
- Python性能提升20倍居然不是标题党?
- Spark开发电商日志分析用户行为聚合功能练习下面开始搭建开发环境注意Task表中最后一个列task_param中,Json的StartDate和EndDate需要设置成今天,因为mock数据的时候,
- HDU 3783 ZOJ
- HDU 1412 {A} + {B}
- HDU 2092 整数解
- Hadoop数据分析平台实战——020Hadoop Shell命令(初学跳过)离线数据分析平台实战——020Hadoop Shell命令(可跳过)
- HDU 2080 夹角有多大II
- 二分查找模版
- Hadoop数据分析平台实战——010hadoop介绍安装
- Python为什么文件运行和在命令行运行同样语句但结果却不同?
- HDU 2034 人见人爱A-B
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python3笔试实际操作基础3.md
- python线程(二)代码部分Threading模块
- python threading.current_thread().name和.getName()有什么区别
- Golang是如何操作excel的?
- Typecho配置多国语支持,检查客户端语言自动切换翻译
- NgModule imports定义的运行时数据结构
- 用Windows电脑训练深度学习模型?超详细配置教程来了
- Angular No provider for EffectsRootModule错误消息
- Leetcode No.15 三数之和
- 正则表达式介绍与使用
- Angular StoreFeatureModule
- Angular Component之间的事件通知机制
- 如何将你的Python项目全面自动化?
- 正则表达式介绍与使用
- Angular ERROR NullInjectorError: R3InjectorError(AppModule)的错误分析