GOF23设计模式之享元模式之理解



享元模式(FlyWeight)

     内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。

     节省了内存,有些时候,会造成运行时间的加长。

核心:

     享元模式以共享的方式高效地支持大量细粒度对象的重用

     享元对象能做到共享的关键是区分了内部状态和外部状态。

         内部状态:可以共享,不会随环境变化而改变。

         外部状态:不可以共享,会随环境变化而改变。

 

围棋软甲设计:

     每个围棋棋子都是一个对象:

     有如下对象:

颜色


         形状       这些事可以共享的,称之为内部状态

         大小

     位置: 这些不可以共享称之为外部状态。

     我们可以看到,在一局棋中,可以有几十或者几百个黑白棋子,但是我们考察这些棋子对象,会发现,所有的黑色棋子或者白色的棋子,他们的颜色,形状,大小都是一样的。这些一样的属性,在享元模式中我们称之为内部状态

     而每个棋子的位置都是不一样的,这类属性称之为外部状态

 

     享元模式实现:

  • FlyweightFactory享元工厂类:
    
    创建并管理享元对象(也就是享元模式通常要和工厂模式搭配起来),享元池一般设置为键值对
  • FlyWeight抽象享元类
    
    通常是一个接口或者抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
  • ConcreteFlyWeight具体享元类
    
    为内部状态提供成员变量进行存储(如棋子的颜色,形状,大小)
  • UnsharedConcreteFlyWeight非共享享元类
    
    不能被共享的子类可以设计为非共享享元类。(如棋子的位置)

应用场景:

     享元模式由于其共享的特性,可以在任何池中操作,比如,线程池,数据库连接池。

     String类的设计也是享元模式。(共享常量池中的对象)

 

优点:

     极大减少了内存中对象的数量

     相同或相似对象内存只存一份,极大地节约资源,提高系统性能

     外部状态相对独立,不影响内部状态

缺点:

     模式较为复杂,使得程序逻辑复杂化

     为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长。用时间换取了空间。
				
时间: 2024-08-10 08:21:31

GOF23设计模式之享元模式之理解的相关文章

设计模式之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

设计模式(享元模式)

享元模式可以理解是一个对象的缓存,通过构建一个享元工厂对所有的对象进行管理. 代码如下: Flyweight 享元的接口 public interface Flyweight { public void doAction(); } FlyweightImpl 具体被共享的类实现 public class FlyweightImpl implements Flyweight{ @Override public void doAction() { System.out.println("doActi

纵横之设计模式(享元模式-性能与对象访问)

声明:本系列文章内容摘自<iOS设计模式> 享元模式:运用共享技术有效地支持大量细粒度的对象. 何为享元模式 实现享元模式需要两个关键组件,通常是可共享的享元对象和保存它们的池.某种中央对象维护这个池,并从它返回适当的实例,工厂是这一角色的理想候选.它可以通过一个工厂方法,根据父类型返回各种类型的具体享元对象.其主要目的就是维护池中的享元对象,并适当的从中返回享元对象. 何时使用享元模式 1.应用程序使用很多对象: 2.在内存中保存对象会影响内存性能: 3.对象的多处持有状态(外在状态)可以放

Java设计模式之享元模式实例详解

本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

深入理解JavaScript系列(37):设计模式之享元模式

介绍 享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生产大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数以外,开销基本相同的 话,就可以大幅度较少需要实例化的类的数量.如果能把那些参数移动到类实例的外面,在方法调用的时候将他们传递进来,就可以通过共享大幅度第减少单个实例 的数目. 那么如果在JavaScript中应用享元模式

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

【设计模式】享元模式(Flyweight)

摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1.先来一个段子: GG每天给MM至少发一条短信,而且每天入睡前是必有一条短信的,往往是一些琐事和一些比较肉麻的情话.开始的一个月,GG还对此是乐不可支,随着时间的推移,那些肉麻的话说了很多遍,自己也觉得厌烦了,而且更让人不可忍耐的是这些肉麻的情话每次都要重复的输入.GG把这一烦心事告诉了自己的好友K

Java进阶篇设计模式之七 ----- 享元模式和代理模式

前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 用通俗的话来说就是进行共用.生活中也有一些例子,比如之前很火的共享单车,更早之前的图书馆,编程中经常用的String类,数据库连接池等等.当然,享元模式主要的目的是复用,如果该对象没有的话,就会进行创建. 享

Head First设计模式之享元模式(蝇量模式)

一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象. 二.结构 三.实现 namespace DesignPattern