1.享元模式的定义

享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的。(内部状态分离出来共享)

对象的内部状态: 不变且重复出现的数据,
对象的外部状态: 变化的数据

  • 运用共享技术有效地支持大量细粒度的对象,通过共享享元对象来减少对内存的占用。
  • 把外部状态分离出来,放到外部,让应用在使用的时候进行维护,并在需要的时候传递给享元对象使用。

享元工厂:为了控制对内部状态的共享,并且让外部能简单地使用共享数据,提供一个工厂来管理享元。


public interface Flyweight {//传入外部状态 public void operation(String extrinsicState);
}public class ConcreteFlyweight implements Flyweight{ private String intrinsicState;//描述内部状态 public ConcreteFlyweight(String state){this.intrinsicState = state;}public void operation(String extrinsicState) {//具体的功能处理,可能会用到享元内部、外部的状态}
}
public class UnsharedConcreteFlyweight implements Flyweight{ private String allState;//描述对象的状态  public void operation(String extrinsicState) {// 具体的功能处理}
}public class FlyweightFactory {//缓存多个flyweight对象,这里只是示意一下 private Map<String,Flyweight> fsMap = new HashMap<String,Flyweight>();//获取key对应的享元对象  public Flyweight getFlyweight(String key) {//这个方法里面基本的实现步骤如下:       //1:先从缓存里面查找,是否存在key对应的Flyweight对象Flyweight f = fsMap.get(key);//2:如果存在,就返回相对应的Flyweight对象if(f==null){//3:如果不存在//3.1:创建一个新的Flyweight对象f = new ConcreteFlyweight(key);//3.2:把这个新的Flyweight对象添加到缓存里面fsMap.put(key,f);//3.3:然后返回这个新的Flyweight对象}return f;}
}public class SecurityMgr {private Map<String,Collection<Flyweight>> map = new HashMap<String,Collection<Flyweight>>();public boolean hasPermit(String user,String securityEntity,String permit){Collection<Flyweight> col = map.get(user);if(col==null || col.size()==0){System.out.println(user+"没有登录或是没有被分配任何权限");return false;}for(Flyweight fm : col){//输出当前实例,看看是否同一个实例对象System.out.println("fm=="+fm);if(fm.match(securityEntity, permit)){return true;}}return false;}private Collection<Flyweight> queryByUser(String user){Collection<Flyweight> col = new ArrayList<Flyweight>();for(String s : TestDB.colDB){String ss[] = s.split(",");if(ss[0].equals(user)){Flyweight fm = FlyweightFactory.getInstance().getFlyweight(ss[1]+","+ss[2]);col.add(fm);}}return col;}//登录public void login(String user){//登录的时候就需要把该用户所拥有的权限,从数据库中取出来,放到缓存中去Collection<Flyweight> col = queryByUser(user);map.put(user, col);}public static void main(String[] args) throws Exception{//需要先登录,然后再判断是否有权限SecurityMgr mgr = SecurityMgr.getInstance();mgr.login("张三");mgr.login("李四");     boolean f1 = mgr.hasPermit("张三","薪资数据","查看");boolean f2 = mgr.hasPermit("李四","薪资数据","查看");        System.out.println("f1=="+f1);System.out.println("f2=="+f2);for(int i=0;i<3;i++){mgr.login("张三"+i);mgr.hasPermit("张三"+i,"薪资数据","查看");}}

《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍相关推荐

  1. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  2. 设计模式之享元(flyweight)模式

    现在在大力推行节约型社会,"浪费可耻,节俭光荣".在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致 ...

  3. 【设计模式】享元(Flyweight)模式实例

    系列文章目录 第五章 结构模式(下) 目录 系列文章目录

  4. 设计模式的征途—12.享元(Flyweight)模式

    现在在大力推行节约型社会,"浪费可耻,节俭光荣".在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致 ...

  5. C#字符串与享元(Flyweight)模式

    写这个文章,主要是因为网上对C#字符串和享元模式的误解比较多. Flyweight模式 先说这名字,fly呢,就是苍蝇,没错这里面不是飞的意思,是苍蝇的意思,weight大家都知道,就是重量,苍蝇的重 ...

  6. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  7. 【设计模式】享元模式(C#)

    [设计模式]享元模式 1.概述 Flyweight Design Pattern,结构型模式.享元模式中的"享元"指被共享的单元.享元模式通过复用对象,以达到节省内存的目的. 用于 ...

  8. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. python 享元模式_python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  10. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

最新文章

  1. (每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)
  2. Tries and Ternary Search Trees in Python and Javascript
  3. windows找不到msconfig解决方法
  4. 使用ps命令输出进程列表--用Enki学Linux系列(17)
  5. WINCE源代码配置文件
  6. CodeForces - 1561E Bottom-Tier Reversals(构造)
  7. JAVA面试常考系列一
  8. VSCode设置ESLint语法检查
  9. 在VMWare上安装CentOS8
  10. 视频标签- video 音频标签- audio
  11. 超级美女抽出滤镜抠图
  12. DAO题目:开发一个程序,用于记录车辆购置税
  13. Java8 新特性之流式数据处理
  14. Spring详解一号IOC京都大火篇
  15. Zookeeper出现Error contacting service. It is probably not running问题
  16. JavaSE面向对象
  17. 泰拉瑞亚服务器修改物品,泰拉瑞亚1.4自定义物品名称方法 自定义物品名称详细教程_逗游网...
  18. 如何配置Instantiable pallets
  19. 量子光学偏振态小练习
  20. 是要成为海贼王的男人——日记4.23

热门文章

  1. Uncaught ReferenceError: layer is not defined
  2. mysql 重构同步老数据_MySQL 重构查询的方式
  3. 义教资料均衡验收计算机室解说词,义教均衡迎检现场会导引解说词
  4. python判断字符串中包含某个字符串_Python中最常用的字符串方法!
  5. python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单
  6. linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动
  7. pat数素数 20 c语言,PAT乙级C语言1013 数素数
  8. java 内嵌汇编_C6000嵌入汇编C与汇编对照及功能说明
  9. Tool之ping:如何使用ping命令检测电脑网络故障图文教程
  10. Interview:算法岗位面试—10.17早上—上海某银行人工智能算法岗位(偏算法,四大行之一)技术面试之项目讲解和激活函数的选择