1. 享元模式
  2. 概述
  3. 运用共享技术有效地支持大量细粒度的对象。
  4.  
  5. 适用性
  6. 当都具备下列情况时,使用Flyweight模式:
  7.  
  8. 1.一个应用程序使用了大量的对象。
  9.  
  10. 2.完全由于使用大量的对象,造成很大的存储开销。
  11.  
  12. 3.对象的大多数状态都可变为外部状态。
  13.  
  14. 4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  15.  
  16. 5.应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
  17.  
  18. 参与者
  19. 1.Flyweight
  20. 描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
  21.  
  22. 2.ConcreteFlyweight
  23. 实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。
  24. ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。
  25.  
  26. 3.UnsharedConcreteFlyweight
  27. 并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。
  28. Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
  29.  
  30. 4.FlyweightFactory
  31. 创建并管理flyweight对象。
  32. 确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

测试类:

  1. public class Test {
  2.  
  3. public static void main(String[] args) {
  4. Flyweight fly1 = FlyweightFactory.getFlyweight("a");
  5. fly1.action(1);
  6.  
  7. Flyweight fly2 = FlyweightFactory.getFlyweight("a");
  8. System.out.println(fly1 == fly2);
  9.  
  10. Flyweight fly3 = FlyweightFactory.getFlyweight("b");
  11. fly3.action(2);
  12. System.out.println(fly1==fly3);
  13.  
  14. Flyweight fly4 = FlyweightFactory.getFlyweight("c");
  15. fly4.action(3);
  16.  
  17. Flyweight fly5 = FlyweightFactory.getFlyweight("d");
  18. fly5.action(4);
  19.  
  20. System.out.println(FlyweightFactory.getSize());
  21. }
  22. }
  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. public class FlyweightFactory {
  5.  
  6. private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
  7.  
  8. public FlyweightFactory(String arg) {
  9. flyweights.put(arg, new FlyweightImpl());
  10. }
  11.  
  12. public static Flyweight getFlyweight(String key) {
  13. if (flyweights.get(key) == null) {
  14. flyweights.put(key, new FlyweightImpl());
  15. }
  16. return flyweights.get(key);
  17. }
  18.  
  19. public static int getSize() {
  20. return flyweights.size();
  21. }
  22. }
  1. public interface Flyweight {
  2.  
  3. void action(int arg);
  4. }
  1. public class FlyweightImpl implements Flyweight {
  2.  
  3. public void action(int arg) {
  4. // TODO Auto-generated method stub
  5. System.out.println("参数值: " + arg);
  6. }
  7. }

java设计模式--结构型模式--享元模式的更多相关文章

  1. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

  2. 【设计模式】结构型06享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 首先吐槽下这个名字,享元?共享元素的话感觉还是蛮好的~但是这个英文... 意图:更好的重用.管理对象,减少内存开销,节约资源. 主要解决:在有大量重复对 ...

  3. 《精通Python设计模式》学习结构型之享元模式

    这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye ...

  4. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  5. Java设计模式(5)共享模式/享元模式(Flyweight模式)

    Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...

  6. C#设计模式之十二享元模式(Flyweight)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样 ...

  7. 设计模式11: Flyweight 享元模式(结构型模式)

    Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...

  8. Java设计模式——结构型模式

    Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...

  9. java设计模式结构型模式

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

随机推荐

  1. 转:String.Empty、string=”” 和null的区别

    原文地址:http://www.cnblogs.com/fanyong/archive/2012/11/01/2750163.html String.Empty是string类的一个静态常量: Str ...

  2. Jtree(节点的渲染+资源管理器)(2)

    上一次我们建立一个比较简单的资源管理器,这次我们说一下上面的资源管理器的问题,并且得尽量的贴近windows的资源管理器. 这样一个简单的资源管理树就完成了,下面我们说说它的问题: ① 图片和外观和W ...

  3. Java Web----Java Web的数据库操作(一)

    Java Web的数据库操作 一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库 ...

  4. jQuery 各种选择器 $.()用法

    jQuery 元素选择器jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") 选 ...

  5. lucene 高亮显示

    原文地址: http://blog.csdn.net/javaman_chen/article/details/8224407 Lucene针对高亮显示功能提供了两种实现方式,分别是Highlight ...

  6. hdu 5685 Problem A

    Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串 ...

  7. mysql语句添加索引

    1.PRIMARY  KEY(主键索引)        mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  ) 2. ...

  8. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(2)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选的第二部分,其余章节将陆续放出.上一 ...

  9. Salt安装

    salt-master安装 [salt-master]# yum install salt-master 或者 curl -L http://bootstrap.saltstack.org | sud ...

  10. android studio 开发android app 真机调试

    大家都知道开发android app 的时候可以有2种调试方式, 一种是Android Virtual Device(虚拟模拟器) ,另一种就是真机调试. 这里要说的是真机调试的一些安装步骤: 1. ...