前言

享元模式是池技术(String常量池、数据库连接池、缓冲池等)的重要实现方式,可以减少应用程序创建对象,降低程序内存的占用,提高性能。

定义

使用共享对象,有效的大量细粒度的对象

结构图

角色拆解分析:
1.Flyweight:抽象享元角色,同时定义出对象的外部和内部状态的接口或实现
2.ConcreteFlyweight:具体享元角色,实现Flyweight定义的业务
3.FlyweightFactory:享元工厂,负责管理对象池和创建享元对象

举栗实现

我们都知道京东618狂欢节,还有天猫双十一,卖的东西都很便宜(也有很多套路,比如先涨价再打折…)。“剁手党”们近乎疯狂的扫货,更有甚者不但“剁手”,还“剁脚”。每个人的订单都生成一个商品对象,那就直接Out Of Memory了。

1.Flyweight抽象享元角色

这是一个商品接口,定义了商品的价格标签

public interface IGoods {public void showGoodPrice(String name);
}

2.ConcreteFlyweight具体享元角色
商品类实现IGoods接口,其中name为内部状态,version为外部状态(内部状态指对象共享出来的信息,存储在享元对象内部不会因为环境改变;外部状态指对象得以依赖的标记,随环境改变、不可共享)

public class Goods implements IGoods {private String name;//商品名称,内部状态private String version;//配置,外部状态public Goods(String name) {this.name = name;}@Overridepublic void showGoodPrice(String version) {if (version.equals("乞丐版")){System.out.print("便宜,没几个钱");}else if (version.equals("顶配版")){System.out.print("过万了");}}
}

3.FlyweightFactory享元工厂
创建商品对象,并以map来存储。将内部状态name作为key,如果存在就继续存,否则就创建新的

public class GoodsFactory {private static HashMap<String,Goods> map = new HashMap<String,Goods>();public static Goods getGoods(String name){if (map.containsKey(name)){System.out.print("商品对象存在,key为"+name);return map.get(name);}else {Goods goods = new Goods(name);map.put(name,goods);System.out.print("创建商品对象,key为"+name);return goods;}}
}

4.客户端调用
通过享元工厂的getGoods方法来创建对象,并调用Goods中的showGoodPrice方法来显示价格

public class EnjoyClient {public static void main(String []args){Goods hp = GoodsFactory.getGoods("暗影精灵");hp.showGoodPrice("乞丐版");Goods hp2 = GoodsFactory.getGoods("暗影精灵");hp2.showGoodPrice("乞丐版");Goods hp3 = GoodsFactory.getGoods("暗影精灵");hp3.showGoodPrice("顶配版");}
}

优缺点对比

优点
减少了对象的创建,降低了程序内存的占用,提高效率
缺点
提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变

使用场景

1.系统中存在大量的相似对象
2.需要缓冲池的场景

最后说一句

1.运用共享技术有效地支持大量细粒度对象的复用
2.享元工厂实际就做了两件事:维护享元池;提供一个遍历key返回对象的方法
3.从某种意义上来讲,享元模式就是单例模式+工厂模式

设计模式之享元模式学习笔记相关推荐

  1. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

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

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

  3. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  4. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

  5. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

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

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

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

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

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

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

  9. Java设计模式之享元模式

    Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...

最新文章

  1. 【USACO Mar08】 奶牛跑步 A-star k短路
  2. QDoc特殊内容special content
  3. linux之权限管理_1
  4. eclipse不能调试运行Android程序问题的解决办法
  5. 谷歌浏览器linux太耗电,Chrome浏览器太耗电?微软出招
  6. Linux下samba服务的错误处理
  7. android ViewPager 图片浏览和保存图片
  8. 微信独立精彩互换抢红包系统源码ThinkPHP开源版
  9. Springboot整合Nacos配置中心
  10. 直播预告|阿里云天池牛年读书会《中学生可以这样学Python(微课版)》
  11. PHP基础2--基本语法
  12. python 百度搜索结果_Python洗涤百度搜索结果
  13. PowerDesigner物理模型生成Excel文件
  14. TX2平台cmake安装
  15. 全网最全Linux命令总结!!(史上最全,建议收藏)
  16. 白盒测试和黑盒测试(感谢东子哥作答)
  17. 【每日蓝桥】16、一三年省赛Java组真题“幸运数”
  18. 中国历史上的著名武将有哪些?
  19. 网易云课堂web安全学习第七天——了解url跳转漏洞
  20. postgis routing pgr_dijkstra道路拓扑分析与方向分析

热门文章

  1. 如何获取微信openId
  2. Spring3.x与jdk8兼容问题
  3. Spring + Mybatis 集成原理分析
  4. 姚期智:这是一个“前所未有”的金融科技与计算机科学的黄金时代
  5. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
  6. ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展
  7. C#实现身份证号码验证的方法
  8. 编写高性能的 Lua 代码
  9. 2016校招内推 -- 阿里巴巴前端 -- 四面面试经历
  10. ZendStudio导入一个已有的网站