享元模式

设计模式-享元模式(Flyweight Pattern)

主宰稳场 提交于 2020-01-27 22:34:51
享元模式 定义 Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象。 类型 结构型。 适用场景 在对象(相同或相似的对象)足够多的时候,而创建这些对象造成了很大的系统开销时,应该考虑使用享元模式。 享元有被频繁使用的场景,才有使用享元模式的价值,因为,在使用享元模式的时候需要维护一个所有已经存在的享元的key-value数据结构,如HashMap(线程不安全)等,这本身也是需要消耗系统资源的,相当于以空间换时间。 优点 通过共享对象节约了内存资源,降低了性能消耗。 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。 缺点 享元模式需要维护一个记录了系统已有的所有享元的列表,这本身也需要消耗资源,在每一次使用享元使都需要进行一次查找,这降低了程序的运行效率。 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。 内部状态与外部状态 在享元对象内部并且不会随环境的改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了,当然享元是可以没有内部状态的,而外部状态最好由客户代码或者第三方类托管。 例子 Employee接口

设计模式--享元模式

↘锁芯ラ 提交于 2020-01-27 07:55:19
享元模式使用共享技术(开辟一块静态的存储区域,将相似的对象放入该静态区域),实现相同或者相似对象大量细粒度的对象复用,达到共享类或者对象的目的。 减少了空间复杂度,加大了时间复杂度 系统使用少量的对象,而这些都比较相似,状态变化小,可以实现对象的多次复用。 享元模式中两个重要的概念 内部状态:在享元对象内部不随外界环境改变而改变的共享部分。 外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。 由于享元模式区分了内部状态和外部状态,所以可以通过设置不同的外部状态使得相同的对象具备不同的特性。内部状态存储于享元对象内部,外部状态则应该由客户端来考虑。 享元模式的UML图 Flyweight抽象享元类。ConcreteFlyweight具体享元类,指定内部状态,为内部状态增加存储空间。关心共享部分,代表了内部状态的共享值,共享值要结合FlyweightFactory来看。UnsharedConcreteFlyweight非共享具体享元类,支出那些不需要共享的Flyweight子类。FlyweightFactory享元工厂类,用来创建并管理Flyweight对象,确保合理的共享Flyweight。 享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首相从享元池中获取,如果享元池中不存在,则创建一个新的享元对象给用户

享元模式(Flyweight)

冷暖自知 提交于 2020-01-22 02:06:56
一、定义 运用共享技术有效地支持大量细粒度的对象。又名“蝇量模式”。 说到享元模式,第一个想到的应该就是池技术了。String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象"adam",下次再创建相同的字符串"adam"时,只是把它的引用指向"adam",这样就实现了"adam"字符串再内存中的共享。 享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的消耗。享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。 内部状态是存储在享元对象内部的,不会随环境的改变而改变。内部状态是可以共享的。 外部状态是随环境的改变而改变的、不可以共享的。享元对象的外部状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外部状态不可以影响享元对象的内部状态,他们是相互独立的。 享元模式可以分成单纯享元模式和复合享元模式。 二、单纯享元模式 单纯享元模式包含的角色如下: 抽象享元角色(Flyweight):给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。 具体享元角色(ConcreteFlyweight)

享元模式

。_饼干妹妹 提交于 2020-01-21 12:33:37
一、定义 享元模式:Flyweight的内部状态是用来共享的,Flyweightfactory负责维护一个Flyweight池(存放内部状态的对象),当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用的,如果有,factory只是简单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象.池为重复或可共享的对象、属性设置一个缓冲,称为内部状态。这些内部状态一般情况下都是不可修改的,也就是在第一个对象、属性被创建后,就不会去修改了(否则就没意义了)。 二、实现代码 三、测试代码 四、运行结果 来源: CSDN 作者: Amber_LYP 链接: https://blog.csdn.net/weixin_44603985/article/details/104007581

设计模式@第14章:享元模式

扶醉桌前 提交于 2020-01-10 22:52:21
第14章:享元模式 一、展示网站项目需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 二、传统方案解决网站展现项目 直接复制粘贴一份,然后根据客户不同要求,进行定制修改 给每个网站租用一个空间 方案设计示意图 14.3 传统方案解决网站展现项目-问题分析 需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费 解决思路:整合到一个网站中,共享其相关的代码和数据,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享,减少服务器资源 对于代码来说,由于是一份实例,维护和扩展都更加容易 上面的解决思路就可以使用 享元模式 来解决 14.4 享元模式基本介绍 享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象

Java学习笔记之--------享元模式

三世轮回 提交于 2020-01-07 21:07:33
场景 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或者相似的对象,我们可以通过享元模式来节省内存。 享元模式核心 享元模式以共享的方式高效的支持大量细粒度对象的重用。 享元对象能够做到共享的关键是区分了内部状态和外部状态。内部状态:可以共享,不会随环境变化而变化;外部状态:不可以共享,会随环境变化而变化。 享元模式实现 FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对。 Flyweight抽象享元类:通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 ConcreteFlyweight具体享元类:为内部状态提供成员变量进行存储。 UnsharedConcreteFlyweight非共享享元类:不能被共享的子类可以设计为非共享享元类。 享元模式demo 在下围棋的时候,每颗围棋除了棋盘上所处位置不同,其他的特性都是相同的。颜色,形状,大小可以定义为可共享的内部状态;位置定义为不可共享的外部状态。 定义享元类ChessFlyWeight,定义非共享享元类Coordinate展示棋子所在位置,定义具体享元类ConcreteChess来展示棋子的特性,定义享元工厂类ChessFlyWeightFactory。 public interface ChessFlyWeight { void setColoe

1.10(设计模式)享元模式

让人想犯罪 __ 提交于 2020-01-02 00:34:33
享元模式主要解决减少创建对象数量,减少内存占用,节约资源,提高性能。 享元模式先从已有对象中匹配,如果有则使用已有对象,没有才会创建新的对象, 这样可以实现对象的复用,减少不必要的创建。 基本思路:使用HashMap将对象存储起来,后续使用时在HashMap中寻找,如果有则使用已有对象, 如果没有则创建对象,并将其放在HashMap中。 假设现在需要绘制圆形,圆形有几个参数,圆心位置,半径,颜色。 如果每次绘制圆,圆心,半径每次都可能不一样。 但是,不同位置,不同半径的圆的颜色可能是相同的。 此时我们就可以通过颜色来区分圆。 例如一个圆半径为3,一个圆半径为10,但都是红色的圆, 我们就只需要创建一个红色圆对象,为其设置半径和位置即可,不必创建两个对象。 Shape public interface Shape { void draw(); } Circle, 实现Shape接口,主要属性,x,y圆心坐标,radius半径,color颜色。 初始化对象时,构造函数设Color public class Circle implements Shape{ private String color; private int x; private int y; private int radius; public String getColor() { return color; }

设计模式之享元模式

て烟熏妆下的殇ゞ 提交于 2020-01-02 00:34:21
享元模式 FlyWeight 2019-06-21 14:47:30 参考博文: https://blog.csdn.net/zhiduoniu/article/details/18267451 侵权必删 什么是享元模式: 以共享的方式高效地支持大量细粒度对象的重用。 适用性: 大量细粒度对象 存在的场合。(细粒度:相似的对象) 享元模式基本角色: 单例简单工厂:维护一个共享对象池采用HashMap,创建并管理享元对象 抽象享元类:具体享元类的抽象,向外界提供享元对象接口。 具体享元类:实现了抽象享元类,其实例称为享元对象;在具体享元类中为 内部状态提供了存储空间 。 内部状态和外部状态的概念: 内部状态是共享对象共有的状态,一般作为具体享元类的成员变量 外部状态是受到客户端调用的影响,通过外部注入的方式获得,如方法的参数。 享元模式的代码要点: 单例简单工厂:单例模式,共享对象池,创建并管理享元对象。 抽象享元类:提供方法接口 具体享元类:内部状态,实现抽象方法 享元模式类图: 享元模式的基本代码: package FlyWeightDemo; /** * 抽象享元类 * 需要分离内部状态和外部状态 * 内外部状态的含义:内部状态是所有共享对象共有的相同的状态,一般作为成员变量; * 外部状态是收到客户端调用的影响,不是共享的状态 * */ public abstract

设计模式 结构型---享元模式

烂漫一生 提交于 2019-12-29 22:56:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、享元模式基本介绍 享元(Flyweight)模式也叫做蝇量模式,运用共享技术有效地支持大量细粒度的对象; 常用于系统底层开发,解决系统性能问题,像数据库连接池,里面都有创建好的连接对象, 在这些对象中,有我们需要的就直接拿来用,避开重新创建,如果没有我们需要的,则创建一个 ; 享元模式能解决重复对象内存浪费问题,当系统有大量相似对象,需要缓冲池时,不需要总是重新创建对象,可以冲缓冲池里拿,这样可以降低系统内存,同时提高效率; 享元模式经典应用场景就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式就是池技术重要实现方式。 二、享元模式中组成部分 Flyweight类:抽象的享元角色,他是产品的抽象类,同时定义出产品的外部状态和内部状态的接口或者实现。 ConcreateFlyweight类:具体的享元角色,是具体的产品类,实现抽象角色的相关业务; UnshaedConcreateFlyweight类:不可共享的角色,一般不会出现在享元工厂; FlyweightFactory类:享元工厂类,用于构建池容器,同时提供从池中获取对象的方法。 三、内部状态和外部状态 享元模式提出两个要求:细粒度和共享对象。 内部状态是指对象共享的信息,存储在享元对象内部且不会随环境的改变而改变;

【设计模式】——享元模式(23)

帅比萌擦擦* 提交于 2019-12-22 18:42:43
一、定义 享元模式就是运用共享技术有效的支持大量细粒度的对象。 二、框架运用 String中的享元模式 三、实战 1、实现类 public abstract class WebSite { protected String name; public WebSite(String name) { this.name = name; } public abstract void show(User user); } public class ConcreteWebSite extends WebSite { public ConcreteWebSite(String name) { super(name); } @Override public void show(User user) { System.out.println("网站名称:"+name+"|网站账号:"+user.getAccount()+"|网站密码:"+user.getPassword()); } 2、实体类 @Data public class User { private String account; private String password; public User(String account, String password) { this.account = account; this