设计模式~享元模式
时间:2022-07-23
本文章向大家介绍设计模式~享元模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
享元模式是对象的结构模式。
享元模式以共享的方式高效的支持大量的细粒度对象。
享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External)。
一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入享元对象内部。
外蕴状态不可以影响享元对象的内蕴状态。也就是说,它们是相互独立的。
享元模式的种类
- 单纯享元模式
- 复合享元模式
单纯享元模式
角色如下:
- 抽象享元角色:此角色是所有具体享元类的超类,为这些类规定出需要实现的公共接口。
- 具体享元角色(ConcreteFlyweight): 实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须于对象所处的周围环境无关,从而使得享元对象可以在系统内共享。
- 享元工厂角色(FlyweightFactory): 本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当的共享。
- 客户端角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行 存储所有享元对象的外蕴状态。
示意源码
抽象享元角色 Flyweight
public abstract class Flyweight {
//一个示意性方法,参数state是外蕴状态
public abstract void operation(String state);
}
具体享元角色 ConcreteFlyweight
public class ConcreteFlyweight extends Flyweight {
private Character intrinsicState = null;
/**
* 构造函数,内蕴状态作为参量传入
* @param state
*/
public ConcreteFlyweight(Character state){
this.intrinsicState = state;
}
/**
* 外蕴状态作为参量传入方法中,改变方法的行为,
* 但是并不改变对象的内蕴状态
*/
@Override
public void operation(String state) {
// TODO Auto-generated method stub
System.out.println("nInstrinsic State = "+intrinsicState + ".Extrinsic State = "+state);
}
}
享元工厂角色 FlyweightFactory
public class FlyweightFactory {
private HashMap flies = new HashMap();
private Flyweight InkFlyweight;
public FlyweightFactory(){}
public Flyweight factory(Character state){
if(flies.containsKey(state)){
return (Flyweight)flies.get(state);
}else{
Flyweight fly = new ConcreteFlyweight(state);
flies.put(state, fly);
return fly;
}
}
/**
* 辅助方法
*/
public void checkFlyweight(){
Flyweight fly;
int i =0;
System.out.println("n====checkFlyweight()=====");
for(Iterator it = flies.entrySet().iterator();it.hasNext();){
Map.Entry e = (Map.Entry)it.next();
System.out.println("Item "+ (++i)+":"+e.getKey());
}
System.out.println("======checkFlyweight()======");
}
}
客户端调用
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个享元工厂对象
FlyweightFactory factory = new FlyweightFactory();
//向享元工厂对象请求一个内蕴状态为‘a’的享元对象
Flyweight fly = factory.factory(new Character('a'));
//以参量方式传入一个外蕴状态
fly.operation("First Call");
//向享元工厂对象请求一个内蕴状态为‘b’的享元对象
fly = factory.factory(new Character('b'));
//以参量方式传入一个外蕴状态
fly.operation("Second Call");
fly = factory.factory(new Character('a'));
fly.operation("Third Call");
factory.checkFlyweight();
}
}
虽然上面申请了三个享元对象,但是实际上创建的享元对象只有两个,这就是共享的含义。
复合享元模式
- PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
- PDF.NET数据开发框架 之SQL-MAP使用存储过程
- 用接口实现事件的一种方法,只是玩玩。
- 国内研究人员首次Wifi重大漏洞利用实现 | Krack攻击测试套件打包
- 想成为优秀程序员必知的要点
- Attribute(特性),怎么用才更好?
- 如何使用Airgeddon搭建基于软件的WIFI干扰器
- 还在写SQL的同志,去喝杯咖啡吧!
- 使用XSD编写具有智能提示的XML文件(以SQL-MAP脚本为实例)
- 一个利用CVE-2017-11292的APT样本技术分析(一)
- Attribute(特性),怎么用才更好? —— 字段编号被误解了
- PDF.NET的SQL日志 ASP.net 路径问题 详解
- 【自然框架】稳定版beta1——源码下载,Demo说明
- TOP语句放到表值函数外,效率异常低下的原因分析
- 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 数组属性和方法
- ctfshow-萌新赛
- VC++ libcurl FTP上传客户端程序
- Oracle RAC变更实验之修改11gR2+公网IP地址(网段不变)
- C# 纯控制台创建一个全屏窗口
- MySQL MHA部署添加Linux/Unix基本信息至Django中
- 记一次innobackupex导致的从库无法同步的问题
- mysqlbinlog命令详解记一次有函数的标量子查询导致的查询缓慢
- ctfshow红包题-web
- 微信支付一面(C++后台)
- 强网杯-随便注
- LeetCode 1547. Minimum Cost to Cut a Stick(动态规划)
- 管道符漏洞
- 06-STM32+ESP8266+AIR202远程升级方案-移植STM32+ESP8266实现利用http或https远程更新STM32程序到自己的项目(定时访问升级,备份升级)
- 反射
- 记一次sys 数据库的修复