设计模式--FlyWeight--结构型

2023-11-14

 

程序员是沟通人和机器交流

意图(Intent)
运用共享技术有效地支持大量细粒度的对象。
——《设计模式》GoF

结构(structure)

面向对象的代价
面向对象很好地解决了系统抽象性的问题,同时在大多数
情况下,也不会损及系统的性能。但是,在某些特殊的应
用中下,由于对象的数量太大,采用面向对象会给系统带
来难以承受的内存开销。比如图形应用中的图元等对象、
字处理应用中的字符对象等。



动机(Motivation)
  采用纯粹对象方案的问题在于大量细粒度的对象会
很快充斥在系统中,从而带来很高的运行时代价—
—主要指内存需求方面的代价。
如何在避免大量细粒度对象问题的同时,让外部客
户程序仍然能够透明地使用面向对象的方式来进行
操作?

下面的例子 当我们Charactor 没有Font 这个成员
我们用flyweight合适吗

 

class  Charactor
... {
  
char c; // 16 bit,2 bytes,
  

}


class  system
... {

  
public statci void Main()
...{
    Arraylist list
=new ArrayList(100000);
    
for(i=0;i<list.size(),i++)
...
   Charactor c
=new Charactor();
    list.Add(c);
}

}

}



 

 

当我们有Font这个对象 也没有用到FlyWeight

class  Font    12 +   8 = 20  bytes 其中8表示应用站的地址
... {
    
string fontName;  //4个bytes
    int size; //4个bytes
    Color color; //4个bytes
  

}


class  Charactor // (2+4+20+2)+8bytes=36  这个Font 的倍增效应将相当惊人
... {
  
char c; // 16 bit,2 bytes,
  Font f; // 20 bytes,

}


class  system
... {

  
public statci void Main()
...{
   
//36bytes*100000=360000 bytes=3600k-->3M
    Arraylist list=new ArrayList(100000);//树组大小变成10000000000
  for(i=0;i<list.size(),i++)
...
   Charactor c
=new Charactor();
    list.Add(c);
}

}

}


上面没有用到FlyWeight,显览这里的创建了很多个font对象而且有多个相同吗

 下面用FlyWeight把Font对象共享,Charactor就会调用共享的Font对象

 

 

class  Font    12 +   8 = 20  bytes 其中8表示应用站的地址
...
... {
    
string fontName;  //4个bytes
    int size; //4个bytes
    Color color; //4个bytes
  
// 重写Font.Equals;
}


class  Charactor // (2+4+20+2)+8bytes=36  这个Font 的倍增效应将相当惊人
... {
  
char c; // 16 bit,2 bytes,
  Font f; // 20 bytes;

 
private static Hashtable FontTable;
 

  Font CFont
...{
   
get
...{  return f;  }
  
set
...{
  
if( fontTable.Keys.Exit(f))
...{    this.f=fontTable.Keys[f];

}

  
else
...{
     fontTable.Keys.Add(value);
     
this.f=value;
}



}

}


}


}
class  system
... {

  
public statci void Main()
...{
   
//36bytes*100000=360000 bytes=3600k-->3M
   
    Arraylist list
=new ArrayList(100000);//树组大小变成10000000000
   Font f1=  new Font("宋体",5,Color.Red);

   Font f2
=  new Font("宋体",5,Color.Red);
   
 Charactor c
=new Charactor();
     c.c
='a';
 c.cFont
=f1;

Charactor c2
=new Charactor();
     c2.c
='a';
 c2.cFont
=f2;

    list.Add(c);
}

}



 

Flyweight模式的几个要点
• 面向对象很好地解决了抽象性的问题,但是作为一个运行
在机器中的程序实体,我们需要考虑对象的代价问题。
Flyweight设计模式主要解决面向对象的代价问题,一般不
触及面向对象的抽象性问题。
• Flyweight采用对象共享的做法来降低系统中对象的个数,
从而降低细粒度对象给系统带来的内存压力。在具体实现
方面,要注意对象状态的处理。
• 对象的数量太大从而导致对象内存开销加大——什么样的
数量才算大?这需要我们仔细的根据具体应用情况进行评
估,而不能凭空臆断。
 

应用 

通常在现在 有对象持 连接池等

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式--FlyWeight--结构型 的相关文章

随机推荐

  • Linux-0.11操作系统实验5-信号量的实现和应用

    实验环境 信号量的实现和应用 实验理论 Linux 0 11操作系统实验5理论 信号量与临界区 实验任务 在 Ubuntu 下编写程序 用信号量解决生产者 消费者问题 在 linux 0 11 中实现信号量 用生产者 消费者程序检验之 用信
  • python 快速排序的实现

    快速排序 快速排序 Quicksort 是对冒泡排序的一种改进 快速排序算法通过多次比较和交换来实现排序 其排序流程如下 首先设定一个分界值 通过该分界值将数组分成左右两部分 将大于或等于分界值的数据集中到数组右边 小于分界值的数据集中到数
  • DVWA-10.XSS (DOM)

    大约 跨站点脚本 XSS 攻击是一种注入问题 其中恶意脚本被注入到原本良性和受信任的网站上 当攻击者使用 Web 应用程序发送恶意代码 通常以浏览器端脚本的形式 时 就会发生 XSS 攻击 给其他最终用户 允许这些攻击成功的缺陷非常普遍 并
  • IDEA2021/2020 Run Dashboard的打开方法

    IDEA中微服务在service窗口以配置方式启动 网上千篇一律的在 workspace xml中配置Run Dashboard 但是只有在旧版本中才有这个节点的配置 但是新版的该怎么办呢 压根就没有这个节点 硬着头皮添加进去你会发现 问题
  • 卫星电话是直接与卫星通信还是通过地面站?

    问题 卫星电话是直接与卫星通信还是通过地面站 如果直接与卫星通信 那么得多大的发射功率 那么小的手机怎么能达到那个功率 如果是通过地面站的话 那么地面站岂不是和现在的蜂窝小区基站差不多了吗 我查卫星通信的时候 有一个人举例说明卫星通信的作用
  • 病毒分类

    根据病毒存在 隐藏 感染和激活的方式进行分类 寄生病毒 这是最常见的病毒类型 病毒并不是一个独立的程序 而是嵌入某个实用程序的一段代码 嵌入病毒的实用程序 称为感染了病毒的实用程序 一旦运行感染了病毒的实用程序 将首先激活病毒 由病毒完成对
  • 一、MicroPython移植到任意平台(简介以及源码裁剪)

    目录 一 MicroPython简介 二 MicroPython源码 1 源码获取 2 源码介绍 三 移植条件 四 系统结构 五 移植过程 一 MicroPython简介 适用于嵌入式设备的python开源解释器 占用资源少 可移植性强 二
  • linux下shell脚本启动jar包

    样例1 bin bash jar包文件路径及名称 目录按照各自配置 APP NAME home jar sys modules gen lgs modules gen jar 日志文件路径及名称 目录按照各自配置 LOG FILE home
  • C++函数模板和类模板的声明和定义问题

    C 函数模板和类模板的声明和定义问题 编译器并不是把函数模板处理成能够处理任意类的函数 编译器从函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译 在声明的地方对模板代码本身进行编译 在调用的地方对参数替换后的代码进行编译
  • JVM入门必备

    1 JVM 的位置 2 JVM 的体系结构 JVM Java虚拟机 是Java程序的运行环境 它对于Java平台的运行和跨平台特性的实现有着重要的作用 JVM的体系结构有以下几个部分 类加载器 ClassLoader 负责将 class字节
  • Nginx多站点部署

    背景 在nginx下每次新增站点需要修改nginx conf配置文件 比较麻烦 还容易出错 可以采用导入外部配置的方式进行添加 操作 将主配置文件中的server节点进行备份 然后删除主配置文件中的server 添加下面的配置 http i
  • SRAM,SDRAM,DRAM,ROM,EPROM,EEPROM

    SRAM 静态RAM 不用刷新 速度可以非常快 像CPU内部的cache 都是静态RAM 缺点是一个内存单元需要的晶体管数量多 因而价格昂贵 容量不大 什么是SRAM SRAM 的英文全称是 Static RAM 翻译成中文就是 静态随机存
  • hackbar 的简单使用

    https www cnblogs com wayne tao p 11027650 html 前言 hackbar是web渗透时的经典工具 但是当我开始学习网络安全的时候 发现hackbar已经开始收费了 本篇抛砖引玉介绍几个使用方法 针
  • springmvc源码学习(二十八)解决跨域的几种方式

    目录 前言 一 跨域 二 解决 1 CorsFilter 2 实现 WebMvcConfigurer 3 实现 HandlerInterceptor 前言 一 跨域 是由于浏览器的同源策略限制 同源策略是一个重要的安全策略 会阻止一个域的j
  • 解决Windows update medic service服务禁用不了拒绝访问

    解决Windows update medic service服务禁用不了拒绝访问 解决方法 方法一 CMD命令 1 首先使用 Win R 组合快捷键 打开运行对话框 然后输入命令 cmd 点击下方的 确定 打开服务 如下图所示 复制这条命令
  • 【Java面试】Mysql为什么使用B+Tree作为索引结构

    一个工作8年的粉丝私信了我一个问题 他说这个问题是去阿里面试的时候被问到的 自己查了很多资料也没搞明白 希望我帮他解答 问题是 Mysql为什么使用B Tree作为索引结构 关于这个问题 看看普通人和高手的回答 普通人 B 数它的特征就是相
  • 用VS Code创建ASP.NET Core Web API项目:TodoWebApi。(默认空项目,不与数据库交互)

    目录 一 使用VS Code终端创建一个 Net Core Web API项目 二 使用VS Code添加相关的NuGet程序集 2 1 方式一 使用 VS Code 终端的 dotnet 命令添加相关的NuGet程序集 2 2 方式二 使
  • TRC20和ERC20的区别(trc20怎么换成erc20)

    TRC20和ERC20的区别 trc20怎么换成erc20 TRC20和ERC20是两种不同的区块链协议 分别基于波场 TRON 和以太坊 Ethereum 网络 它们都可以用来发行代币 比如USDT 但是在转账费用 交易速度 智能合约等方
  • Flutter安装部署运行,bug笔记

    1 根据官方文档下载flutterSDK 附带dart AndroidStudio下载flutter插件 附带dart 2 然后在flutter路径的cmd命令框 或在AS新项目目录里的文件pubspec yaml界面 或在AS命令框执行f
  • 设计模式--FlyWeight--结构型

    程序员是沟通人和机器交流 意图 Intent 运用共享技术有效地支持大量细粒度的对象 设计模式 GoF 结构 structure 面向对象的代价面向对象很好地解决了系统抽象性的问题 同时在大多数情况下 也不会损及系统的性能 但是 在某些特殊