享元模式

享元模式

寵の児 提交于 2019-12-05 04:28:33
28.1 内存溢出, 司空见惯下午, 我正在开会中, 老大推门进来。“三儿, 出来一下。 ”我刚出会议室门口, 老大就发话了。“郎当(姓朗, 顺口就叫郎当) 的那个报考系统又crash了一台机器, 两天已经宕了4次了, 你这边还有紧急的事情没有? ……没有, 那赶快过去顶一下, 就运行三天的程序, 两天宕了4次, 还怎么玩? ! ”我马上收拾东西, 冲到马路上拦了出租车, 同时打电话给郎当。“三哥, 厂商人员已经定位出了, OutOfMemory内存溢出, 没查到有内存泄漏的情况, 现在还在跟踪……是突然暴涨的, 都是在繁忙期出现问题的……”内存溢出对Java应用来说实在是太平常了, 有以下两种可能。● 内存泄漏无意识的代码缺陷, 导致内存泄漏, JVM不能获得连续的内存空间。● 对象太多代码写得很烂, 产生的对象太多, 内存被耗尽。 现在的情况是没有内存泄漏, 那只有一种原因——代码太差把内存耗尽。到现场后, 郎当给我介绍了一下系统情况。 该系统是一个报考系统, 其中有一个模块负责社会人员报名, 该模块对全国的考试人员只开放3天, 并且限制报考人员数量。 第一天9点开始报考, 系统慢得像蜗牛, 基本上都不能访问, 后来设置了HTTP Server的并发数量, 稍有缓解, 40分钟后宕了一台机器, 10分钟后, 又挂了一台, 下午3点又挂了一台, 看样子晚上要让郎当去寺庙烧烧香了

设计模式——享元模式

ⅰ亾dé卋堺 提交于 2019-12-04 15:06:09
定义 享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。 模板 FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对 FlyWeight抽象享元类:通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行存储 UnsharedConcreteFlyWeight非共享享元类:不能被共享的子类可以设计为非共享享元类 实例 看下面一张普通的快递列表页面: 该列表中有两种内容: 一种是快递信息行 另一种是 标题行(大些字母表示的用于分类的)。对于这样一个页面: ConcreteFlyWeight部分: 两类信息的view布局 UnsharedConcreteFlyWeight: 标题内容/快递名称及图片 android中对于列表的view复用已经封装在ListView/RecyclerView中,业务只需要实现相应的接口即可实现布局的复用,但这里复用的核心思想就是 “享元模式”。 具体的实现与分析,见下面的代码 public class ExpressAdapter extends RecyclerView

享元模式

寵の児 提交于 2019-12-04 06:38:35
定义:提取相似之处作为共享技术 优: 相同对象只要保留一份,降低了系统中对象的数量 缺: 1.为了使对象共享,须将一些不能共享的状态外部化,将增加程序的负责性 2.读取享元模式的外部状态,使得运行时间稍变长 状态: 1.内部状态:即不会随着环境的改变而改变的可共享部分 2.外部状态:随着环境改变而改变的不可共享的部分 结构: 1.抽象享元角色(Flyweight):是所有具体享元类的基类,为具体的享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入 2.具体享元角色(Concrete Flyweight):实现1的接口 3.非享元角色(Unsharable Flyweight):是外部状态 4.享元工厂角色(Flyweight Factory):创建和管理享元角色,根据客户端需要的对象,将其返回 来源: https://my.oschina.net/u/2954291/blog/3128808

设计优化——(3)享元模式

独自空忆成欢 提交于 2019-12-04 03:34:23
/*--> */ /*--> */    简介: 享元模式是是设计模式中少有的为提高系统性能为目标的设计模式之一。它的核心思想是:如果系统中存在多个相同的对象,那么只需创建共享的一份对象的拷贝,而不必为每一次使用都创建新的对象。    优点:   1)可以节省重复创建对象的开销,被享元模式维护的相同对象只会被创建一次。   2)创建的对象数量减少,所以对系统的内存减少,GC压力降低。 1.涉及到的角色   1) 享元工厂 :用于创建具体享元类,维护相同的享元对象。它保证相同的享元对象可以被系统共享。即,其内部使用了类似单例模式的算法,当请求对象已经存在时,直接返回对象,不存在时,再创建对象。   2) 抽象享元 :定义需共享的对象的业务接口。   3) 具体享元类 :实现抽象享元的接口,完成某一具体的逻辑。   4) Main :使用享元模式的组件,通过享元工厂取得享元对象 2.抽象享元   IReportManager.java package com.hxc.Share; /** * <p>Description: 抽象享元</p> * @author Huang Xiaocong * @data 2019年10月31日 */ public interface IReportManager { public String createReport(); } 3.享元工厂

享元模式

微笑、不失礼 提交于 2019-12-03 13:26:12
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。 介绍 意图: 运用共享技术有效地支持大量细粒度的对象。 主要解决: 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 何时使用: 1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。 如何解决: 用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。 关键代码: 用 HashMap 存储这些对象。 应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。 优点: 大大减少对象的创建,降低系统的内存

享元模式详解 (附java语言源码)

匿名 (未验证) 提交于 2019-12-02 21:40:30
享元模式(Flyweight Pattern) : 运用共享技术有效地支持大量细粒度的对象。(Use sharing to support large numbers offine-grained objects efficiently.) 享元模式核心 : 享元模式以共享的方式高效地支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分了内部状态和外部状态。 享元模式的优缺点 : 优点: 极大减少内存中对象的数量, 相同或相似对象内存中只存一份,极大的节约资源,提高系统性能 外部状态相对独立,不影响内部状态 缺点 模式较复杂,使程序逻辑复杂化 为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长。用时间换取了空间。 享元模式开发中应用的场景 : 享元模式由于其共享的特性,可以在任何“池”中操作,比如:线程池、数据库连接池。 String类的设计也是享元模式 享元模式实现 : FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对 FlyWeight抽象享元类:通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行存储 UnsharedConcreteFlyWeight非共享享元类

Java设计模式:Flyweight(享元)模式

依然范特西╮ 提交于 2019-12-01 06:09:12
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量 细粒度 对象的复用。 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题。享元模式尝试 重用现有的同类对象,如果未找到匹配的对象则创建新对象 ,从而减少系统中重复创建对象实例的性能和内存消耗。 享元模式将对象的信息分为两个部分:内部状态(Internal State)和外部状态(External State)。内部状态是对象可共享出来的信息, 存储在享元对象内部 并且不会随环境改变而改变。外部状态是随环境改变而改变的、不可共享的状态,必须由客户端保存,并在享元对象创建后在需要使用时再传入到享元对象内部。 应用场景 系统中存在大量相同或相似对象 这些对象可以按照内部状态分为很多组,每组对象都可用一个对象来代替 示例代码 享元模式包含如下角色: 抽象享元(Flyweight) :通常是接口或抽象类,规定所有具体享元角色需要实现的方法(向外界返回内部状态或接受外界传入参数以改变外部状态)。 具体享元(ConcreteFlyweight):实现或继承抽象享元角色,并为内部状态提供存储空间。 享元工厂(FlyweightFactory):创建并管理享元对象,将各种具体享元类存储到一个享元池(或缓存)中。当客户端请求一个具体享元对象时,享元工厂角色会检查池中是否已存在符合要求的享元对象

初学设计模式之享元模式

孤街醉人 提交于 2019-11-29 17:33:37
1 /*利用享元模式买衬衫的程序案例 2 需求:1、库存无某种颜色衬衫时,需要对该颜色衬衫进行进货(列表中无该属性的对象时,新建立该属性对象,再调用) 3 2、库存中有该对象时,直接售卖不用进货(列表中有该属性的对象时,直接调用) 4 程序注解:库存使用map实现的 5 售卖等行为是用cout<<相应的话语模拟实现的 6 */ 7 #include<iostream> 8 #include<string> 9 #include<map> 10 using namespace std; 11 12 //抽象享元类 13 class FlyWeight 14 { 15 public: 16 void sail() 17 { 18 19 }; 20 }; 21 22 //具体的享元类 23 class ConcreteFlyWeight:public FlyWeight 24 { 25 public: 26 ConcreteFlyWeight(string color) 27 { 28 shirtColor = color; 29 cout<<"新入库衬衫颜色"<<shirtColor<<endl; 30 }; 31 void sail() 32 { 33 cout<<"卖掉衬衫颜色为"<<shirtColor<<endl<<endl; 34 }; 35 private: 36

设计模式课程 设计模式精讲 13-3 享元模式源码解析

本秂侑毒 提交于 2019-11-29 14:12:35
1    享元模式源码解析 1.1  享元模式源码解析1(jdk中的应用) 1.2  享元模式源码解析2(tomcat中的应用) 1    享元模式源码解析 1.1  享元模式源码解析1(jdk中的应用) 1.2  享元模式源码解析2(tomcat中的应用) 来源: https://www.cnblogs.com/1446358788-qq/p/11519272.html

设计模式课程 设计模式精讲 13-1 享元模式讲解

∥☆過路亽.° 提交于 2019-11-29 13:41:00
1    课程讲解 1.1  类型: 1.2  定义: 1.3  应用场景: 1.4  优点: 1.5  缺点: 1.6  扩展: 1.7  和其他设计模式比较: 1    课程讲解 1.1  类型: 结构型: 1.2  定义: ◆定义:提供了 减少对象数量 从而改善应用所需的对象结构的方式 ◆运用共享技术有效地支持大量细粒度的对象 (可能对于内存溢出类型的问题解决有效)(池子) 1.3  应用场景: ◆ a  常常应用于系统底层的开发,以便解决系统的性能问题。 ( 系统中如果有大量的对象,可能会造成内存溢出,我们可以把共同的部分抽象出来,有相同的业务请求,则返回在内存中的已有对象,避免重新创建。 ) ◆ b  系统有大量相似对象、需要缓冲池的场景。 (某个对象的复用度越高,越倾向于使用享元模式) 1.4  优点: ◆减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率 ◆减少内存之外的其他资源占用 (a  new对象需要时间,当我们直接从池子中取对象的时候,对象不用创建,节省了时间,特别是当对象并发或者使用率比较高的时候,提高了效率 b  文件句柄和窗口句柄是有一定的限制的,当同一对象被特别多的时候,往往可能导致句柄达到极限而导致崩溃) 1.5  缺点: ◆关注内/外部状态、关注线程安全问题 我们使用共享模式的时候,大都是使用hashMap,不会用HashTable