享元模式

享元模式学习笔记

六月ゝ 毕业季﹏ 提交于 2020-03-12 07:36:25
面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和 对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正是为解决这 一类问题而诞生的。 享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现。类似于线程池,线程池 可以避免不停的创建和销毁多个对象,消耗性能。提供了减少对象数量从而改善应用所需的对象结构的 方式。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独 的对象,以此来降低内存的消耗,属于结构型模式。 原文:Use sharing to support large numbers of fine-grained objects efficiently. 解释:使用共享对象可有效地支持大量的细粒度的对象。 享元模式把一个对象的状态分成内部状态和外部状态,内部状态即是不变的,外部状态是变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。 享元模式模式的本质是缓存共享对象,降低内存消耗。 首先我们来看享元模式的通用UML类图: 从类图上看,享元模式有三个参与角色: 抽象享元角色(Flyweight):享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态 的接口或实现; 具体享元角色(ConcreteFlyweight)

设计模式-实现对象的复用——享元模式

☆樱花仙子☆ 提交于 2020-03-10 01:10:10
1. 享元模式概述 当一个系统中运行时产生的对象数量太多, 将导致运行代价过高, 带来系统性能下降的问题. 享元模式: 运用共享技术有效的支持大量细粒度对象的复用. 系统只使用少量的对象, 而这些对下行都很相似, 状态变化很小, 可以实现对象的多次复用. 由于享元模式要求能够共享对象必须是细粒度的对象, 因此又称为轻量级模式, 它是一种对象结构型模式. 在享元模式结构图中包含如下几个角色: Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。 ConcreteFlyweight(具体享元类):它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。 UnsharedConcreteFlyweight(非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。 FlyweightFactory(享元工厂类):享元工厂类用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储

享元(Flyweight Pattern)模式

女生的网名这么多〃 提交于 2020-03-10 01:09:49
Flyweight在拳击比赛中指最轻量级,选择使用“享元模式”的意译,是因为这样更能反映模式的用意。 享元模式的用意 享元模式对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 享元对象能够做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。 一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而有所不同,因此一个享元可以具有内蕴状态并可以共享。 一个外蕴状态是随环境的改变而改变的、不可共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不会影响享元对象的内蕴状态,也就是说它们是相互独立的。 享元模式的种类 根据所涉及的享元对象的内部表象,享元模式可以分成单纯享元模式和复合享元模式两种形式。 单纯享元模式结构示意图: 复合享元模式结构示意图: 从上面的类图可以看出,在复合享元模式中,享元对象构成合成模式。因此复合享元模式实际上是单纯享元模式与合成模式的组合。 享元模式的应用 享元模式在编辑器系统中大量使用。一个文本编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这个字母,而字母在文本中的位置和字母大小、风格等其他信息则是外蕴状态。比如字母a可能出现在文本的许多地方,虽然这些字母a的位置和字母风格不同

享元模式

戏子无情 提交于 2020-03-10 00:53:28
享元模式: 又称轻量级模式, 是对象池的一种实现。类似于线程池, 线程池可以避免不停的创建和销毁多个对象, 消耗新能。提供了减少对象数量从而改善应用所需的对象结构的方式 特征: 共享细粒度对象, 将多个对同一对象的访问集中起来。属于结构型模式 使用场景: 1、常常应用于系统底层的开发,以便解决系统的性能问题 2、系统有大量相似对象、需要缓冲池的场景 public interface ITicket { void showInfo (String bunk) ; } public class TrainTicket implements ITicket{ private String from ; private String to ; private int price ; public TrainTicket (String from , String to) { this . from = from ; this . to = to ; } @Override public void showInfo (String bunk) { this . price = new Random().nextInt( 2000 ) ; System. out .println( from + "->" + to + ": " + bunk + " 价格 : " + this . price

享元模式

孤者浪人 提交于 2020-03-08 15:05:21
定义:享元模式又称轻量级模式,是对象池的一种实现。我个人的理解就是共享元数据,将常用的对象装到容器里,以便使用的人可以直接使用,而节省了创建、销毁所消耗的资源。 应用场景:连接池、线程池等。代码: public class ConnectionPool { private Vector<Connection> pool; private int poolSize = 10; private String url = ""; private String userName = ""; private String passWord = ""; private String driverClassFroName = ""; public ConnectionPool() { pool = new Vector<Connection>(poolSize); try { Class.forName(driverClassFroName); for(int i = 0; i < poolSize; i++){ Connection conn = DriverManager.getConnection(url, userName, passWord); pool.add(conn); } } catch (Exception e) { e.printStackTrace(); } }

设计模式笔记—11_Flyweight享元模式

别来无恙 提交于 2020-03-04 03:53:19
文章目录 Flyweight享元模式是一种“对象性能”模式 动机 定义 结构 代码对比 flyweight.cpp 对比 要点总结 Flyweight享元模式是一种“对象性能”模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来说,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理 动机 在软件系统采用纯粹对象方案的问题在于 大量细粒度的对象 会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价 如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作? 定义 运用共享技术有效地支持 大量细粒度的对象 结构 代码对比 flyweight.cpp class Font { private: //unique object key string key; //object state //.... public: Font(const string& key){ //... } }; ß class FontFactory{ private: map<string,Font* > fontPool; public: Font* GetFont(const string& key){ map<string,Font*>::iterator item=fontPool

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

孤街醉人 提交于 2020-03-03 15:49:33
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量 相同或相似 对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。 享元模式就是把 相同或相似 对象的公共部分提取出来变为共享的,而不同的部分为对象私有的。这样设计无疑增加了程序的复杂性。 2.模式定义 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式。 属于 对象结构型模式 。 享元模式的理念: 享元模式通过共享技术实现相同或相似对象的重用。 在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。 在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。 享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。 3.模式结构 享元模式的主要角色有如下: 抽象享元角色

C#设计模式学习笔记:(11)享元模式

末鹿安然 提交于 2020-02-19 13:43:07
本笔记摘抄自: https://www.cnblogs.com/PatrickLiu/p/7792973.html ,记录一下学习过程以备后续查用。 一、引言 今天我们要讲结构型设计模式的第六个模式--享元模式,先从名字上来看,“享元”可以这样理解--共享“单元”。单元是什么呢?举例说明:对于图形而言就 是图元;对于英文来说就只26个英文字母;对于汉语来说就是每个汉字。也可以这样理解“元”--构成事物的最小单元,这些单元如果大量且重复出现,我们可 以缓存重复出现的单元,达到节省内存的目的。换个说法享元是为了节省空间,对于计算机而言就是节省内存。 面向对象很好地解决了系统抽象性的问题(系统抽象性指把系统里面的事物写成类,类可以实例化成为对象,用对象和对象之间的关系来设计系统),在 大多数情况下,这样做是不会损及系统的性能的。但是,在某些特殊的应用中,由于对象的数量太大,并且这些大量的对象中有很多是重复的,如果每个对 象都单独的创建(C#的语法是new)出来,会给系统带来难以承受的内存开销,比如图形应用中的图元等对象、字处理应用中的字符对象等。 二、享元模式介绍 享元模式:英文名称--Flyweight Pattern;分类--结构型。 2.1、动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价-

实现对象的复用——享元模式(二)

徘徊边缘 提交于 2020-02-15 09:38:52
享元模式结构较为复杂,一般结合工厂模式一起使用,在它的结构图中包含了一个享元工厂类,其结构图如图 14-3 所示: 图 14-3 享元模式结构图 在享元模式结构图中包含如下几个角色: ● Flyweight (抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。 ● ConcreteFlyweight (具体享元类):它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。 ● UnsharedConcreteFlyweight (非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。 ● FlyweightFactory (享元工厂类):享元工厂类用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合),可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话)

设计模式 | 享元模式及典型应用

寵の児 提交于 2020-02-08 14:03:44
👨 前言 本文的主要内容: 介绍享元模式 示例-云盘 总结 源码分析享元模式的典型应用 String中的享元模式 Integer中的享元模式 Long中的享元模式 Apache Common Pool2中的享元模式 享元模式 享元模式(Flyweight Pattern) : 运用共享技术有效地支持大量细粒度对象的复用 。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。享元模式结构较为复杂,一般结合工厂模式一起使用。 ↘️ 角色 Flyweight(抽象享元类) :通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据( 内部状态 ),同时也可以通过这些方法来设置外部数据( 外部状态 )。 ConcreteFlyweight(具体享元类) :它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。 UnsharedConcreteFlyweight(非共享具体享元类) :并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类