GoF23种设计模式之结构型模式之享元模式
一、概述
运用共享技术有效地支持大量细粒度的对象。
二、适用性
1.当一个应用程序使用了大量的对象的时候。
2.由于使用大量的独享而造成很大的存储开销的时候。
3.对象的大多数状态都可变为外部状态的时候。
4.如果删除对象的外部状态,那么可以用相对较少的共享独享取代很对组对象的时候。
5.应用程序不依赖于对象标识的时候。由于享元模式对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
三、参与者
1.Flyweight:描述一个接口,通过这个接口Flyweight可以接受和作用于对象外部状态。
2.ConcreteFlyweight:实现Flyweight接口,并为内部状态(如果有)增加存储空间。
3.UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但并不强制共享。在Flyweight对象结构的某些层次上,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
4.FlyweightFactory:创建并管理Flyweight对象。确保合理地共享Flyweight对象。当用户请求一个Flyweight对象时,FlyweightFactory提供一个已经创建好的的实例或者创建一个新的实例给它。
四、类图
五、示例
Flyweight
- package cn.lynn.flyweight;
- public interface IPerson {
- public void say(int num);
- }
ConcreteFlyweight
- package cn.lynn.flyweight;
- public class PersonImpl implements IPerson {
- @Override
- public void say(int num) {
- System.out.println("报数:" + num);
- }
- }
FlyweightFactory
- package cn.lynn.flyweight;
- import java.util.HashMap;
- import java.util.Map;
- public class PersonCache {
- private static Map<String, PersonImpl> personPool = new HashMap<String, PersonImpl>();
- public PersonCache(String key) {
- personPool.put(key, new PersonImpl());
- }
- public static IPerson getPerson(String key) {
- if(personPool.get(key) == null) {
- personPool.put(key, new PersonImpl());
- }
- return personPool.get(key);
- }
- public static int getSize() {
- return personPool.size();
- }
- }
Client
- package cn.lynn.flyweight;
- public class Client {
- public static void main(String[] args) {
- IPerson p1 = PersonCache.getPerson("张三");
- p1.say(1);
- IPerson p2 = PersonCache.getPerson("张三");
- System.out.println("p1和p2是同一个人吗?" + ((p1 == p2) ? "是" : "不是"));
- IPerson p3 = PersonCache.getPerson("李四");
- p3.say(2);
- IPerson p4 = PersonCache.getPerson("王五");
- p4.say(3);
- IPerson p5 = PersonCache.getPerson("赵六");
- p5.say(4);
- System.out.println("现有人数:" + PersonCache.getSize());
- }
- }
Result
- 报数:1
- p1和p2是同一个人吗?是
- 报数:2
- 报数:3
- 报数:4
- 现有人数:4
GoF23种设计模式之结构型模式之享元模式的更多相关文章
- GoF23种设计模式之结构型模式之桥接模式
一.概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...
- GoF23种设计模式之结构型模式之组合模式
一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...
- GoF23种设计模式之结构型模式之外观模式
一.概述 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...
- GoF23种设计模式之结构型模式之代理模式
一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...
- GoF23种设计模式之结构型模式之适配器模式
一.概述 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...
- GoF23种设计模式之结构型模式之装饰模式
一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...
- 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)
结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 结构 ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- GoF的23种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
随机推荐
- A Simple Math Problem (矩阵快速幂)
Lele now is thinking about a simple function f(x). If x < 10 f(x) = x. If x >= 10 f(x) = a0 ...
- 前端CSS(3)
前端基础CSS(3) 一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文); /*对齐方式*/ c ...
- PIX 防火墙
---恢复内容开始--- 一 , PIX 防火墙的认识 PIX 是cisco 的硬件防火墙 硬件防火墙的工作速度快,使用方便. PIX 有很多型号,并发连接数是PIX防火墙的重要参数 PIX 25 ...
- DevExpress GridControl 控件二表连动
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 字节码技术---------动态代理,lombok插件底层原理。类加载器
字节码技术应用场景 AOP技术.Lombok去除重复代码插件.动态修改class文件等 字节技术优势 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用 ...
- java中两个map比较
一 /** * 用map的keySet()的迭代器(性能效率较低) * */ public void compareMap1 (){ Map<String, String> m1 = ne ...
- 【转】"超时时间已到。在操作完成之前超时时间已过或服务器未响应"的解决方法
方法有以下三种: 1.原因应该在数据访问有问题,可以把连接时间设置长些,在数据库连接字符串,加上Connect Timeout=18000,单位毫秒 2,在web.config中加上以下语句: < ...
- vuejs vue-resource post方式提交参数PHP $_POST获取不到
- so文件动态加载注意事项
动态加载是指将so文件存放于服务器,在需要用的时候,通过服务器下载到本地,然后加载. 需要注意的: 手机cpu架构,不同的架构运行不同的so 解决方法: 1,欺骗性: 如果so架构不全,就在apk打包 ...
- Java中类成员变量初始化顺序
一. 定义处默认初始化vs构造函数中初始化 java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子 public class FieldsInit { p ...