一、概述 

运用共享技术有效地支持大量细粒度的对象。

二、适用性

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

  1. package cn.lynn.flyweight;
  2. public interface IPerson {
  3. public void say(int num);
  4. }

ConcreteFlyweight

  1. package cn.lynn.flyweight;
  2. public class PersonImpl implements IPerson {
  3. @Override
  4. public void say(int num) {
  5. System.out.println("报数:" + num);
  6. }
  7. }

FlyweightFactory

  1. package cn.lynn.flyweight;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class PersonCache {
  5. private static Map<String, PersonImpl> personPool = new HashMap<String, PersonImpl>();
  6. public PersonCache(String key) {
  7. personPool.put(key, new PersonImpl());
  8. }
  9. public static IPerson getPerson(String key) {
  10. if(personPool.get(key) == null) {
  11. personPool.put(key, new PersonImpl());
  12. }
  13. return personPool.get(key);
  14. }
  15. public static int getSize() {
  16. return personPool.size();
  17. }
  18. }

Client

  1. package cn.lynn.flyweight;
  2. public class Client {
  3. public static void main(String[] args) {
  4. IPerson p1 = PersonCache.getPerson("张三");
  5. p1.say(1);
  6. IPerson p2 = PersonCache.getPerson("张三");
  7. System.out.println("p1和p2是同一个人吗?" + ((p1 == p2) ? "是" : "不是"));
  8. IPerson p3 = PersonCache.getPerson("李四");
  9. p3.say(2);
  10. IPerson p4 = PersonCache.getPerson("王五");
  11. p4.say(3);
  12. IPerson p5 = PersonCache.getPerson("赵六");
  13. p5.say(4);
  14. System.out.println("现有人数:" + PersonCache.getSize());
  15. }
  16. }

Result

    1. 报数:1
    2. p1和p2是同一个人吗?是
    3. 报数:2
    4. 报数:3
    5. 报数:4
    6. 现有人数:4

GoF23种设计模式之结构型模式之享元模式的更多相关文章

  1. GoF23种设计模式之结构型模式之桥接模式

    一.概述         将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...

  2. GoF23种设计模式之结构型模式之组合模式

    一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...

  3. GoF23种设计模式之结构型模式之外观模式

    一.概述         为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...

  4. GoF23种设计模式之结构型模式之代理模式

    一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...

  5. GoF23种设计模式之结构型模式之适配器模式

    一.概述         将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...

  6. GoF23种设计模式之结构型模式之装饰模式

    一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...

  7. 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)

    结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题.   结构 ...

  8. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  9. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

随机推荐

  1. 优化MyEclipse编译速度慢的问题

    转载大神的 https://www.cnblogs.com/luxd/p/5999217.html

  2. Ubuntu同时忘记用户密码和root密码

    在设置密码的时候,用到了小键盘,重启后再次用小键盘输入密码时,发现输入的并不是数字,而是其他符号.所以在设置关键信息的时候,小键盘还是得慎用啊. 解决方案: 在引导界面也就是开机倒计时的时候,按下 e ...

  3. (转)Linux日志管理+ last lastlog lastb

    Linux日志管理+ last lastlog lastb 原文:http://blog.csdn.net/xin_y/article/details/53440707 日志管理 日志通常存放在 /v ...

  4. 有关在python中使用Redis(二)

    这里简单介绍下在python中使用如何使用hashset,set和list: 从list开始: 一般我们使用lpush对一个list进行初始化添加,但是如果需要不断往这个list里面加值,就要用rpu ...

  5. cf519D. A and B and Interesting Substrings(前缀和)

    题意 给出$26$个字母对应的权值和一个字符串 问满足以下条件的子串有多少 首尾字母相同 中间字母权值相加为0 Sol 我们要找到区间满足$sum[i] - sum[j] = 0$ $sum[i] = ...

  6. javascript结合nodejs实现多文件上传

    前端文件上传功能比较依赖后端,所以第一步用nodejs实现一个供文件上传的功能接口. 因为本人对nodejs也是一知半解,所以刚开始的想法是像原始的ajax交互那样,获取上传文件的内容,然后再通过no ...

  7. 零基础逆向工程23_PE结构07_重定位表_IAT表(待补充)

    重定位表 待补充 IAT表 待补充

  8. 使用as开发jni入门(附验证):配置ndk开发环境,配置as相关jni配置

    编写jni,生成so文件: 1.通过as内置的Android SDK下载需要使用的ndk,在系统环境变量设置相关参数 2.新建一个普通as项目,新建一个类,用来静态加载so库和书写本地native方法 ...

  9. SQL Server 2012安装配置(Part1 )

    1 安装前准备 安装 SQL Server 2012 服务器及客户端前,需要提前做以下两项准备: SQL Server2012 依赖于.Net Framework 3.5.1 组件.Windows S ...

  10. Oracle RAC/Clusterware 多种心跳heartbeat机制介绍 RAC超时机制分析

    ORACLE RAC中最主要存在2种clusterware集群件心跳 &  RAC超时机制分析: 1.Network Heartbeat 网络心跳 每秒发生一次: 10.2.0.4以后网络心跳 ...