Flyweight享元模式(结构型模式)
1、面向对象的缺点
虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能。但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如下:
/// <summary>
/// Word文字的Font样式
/// </summary>
public class Font //8+8(继承object的虚表指针4个字节、垃圾收集同步占4个字节)=16个字节
{
public Font(string fontName, int size)
{
_fontName = fontName;
_size = size;
}
string _fontName;//4个字节,但是由于字符串留用技术,可能实际创建大量这个对象的时候,可能会节省一些空间
int _size;//4个字节
} /// <summary>
/// Word文字对象
/// </summary>
public class Charactor //2+4(Font类型的引用指针)+16+2(32位操作系统的内存补齐)+8个字节(继承object的虚表指针4个字节、垃圾收集同步占4个字节)=32个字节
{
public Charactor(char c, Font font)
{
_c = c;
_font = font;
}
char _c;//为一个Unicode字符,16位,占2个字节
Font _font;//16个字节
}
调用代码如下:
public class ThirdSystem
{
public void Run()
{ long a = GC.GetTotalMemory(true);
//创建10000000个Charactor对象大概要消耗32*10000000/1024/1024=343M
int num = ;
//创建1千万个Charactor对象
var list = new List<Charactor>();//不消耗内存,如果使用ArrayList并指定初始化长度,会产生内存消耗
for (var i = ; i < num; i++)
{
Charactor charactor = new Charactor('c', new Font("宋体", ));
list.Add(charactor);
}
long b = GC.GetTotalMemory(true);
long memoryConsume = b - a;
Console.WriteLine(memoryConsume / / );//实际输出369,实际创建10000000个Charactor对象消耗了369M的内存空间
}
}
在客户端系统生成了一千万个对象实例,最后产生了369M的内存开销,还单单是一个对象的实例的开销,这种方式显然不可取.
2、问题
采用对象方法来创建大量的对象实例,产生了很高的运行时代价-主要指内存方面的,那么如何在采用面向对象的方式生成大量对象实例的同时,避免这种开销呢?
关于这个问题,字符串留用池的实现方式.提供了很好的借鉴.关于具体实现思路,请参考字符串留用与字符串池
3、解决方案
4、使用Flyweight享元模式的要点
(1)、该模式不涉及抽象性问题,也就是和抽象无关,它主要是解决面向对象的代价问题,在面向对象的过程中,创建了大量的对象实例,所产生的内存消耗.
(2)、该模式采用共享对象实例的方式来降低系统中对象的个数,也就是通过Hashtable等持有相同对象的引用降低细粒度对象实例带给系统的压力
(3)、因为采用持有相同对象引用的方式来共享对象,所以当一个对象发生改变时,所有的对象都会发生改变,类似数组,所以要注意对象状态的处理,不能盲目的修改.
(4)、该模式最好计算下整个系统的开销,在根据实际情况去判断是否要采用享元模式.
Flyweight享元模式(结构型模式)的更多相关文章
- Flyweight 享元(结构型)
一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用.减少对象的创建减轻内存: 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并可实例化,单例模式的 ...
- 设计模式(十二): Flyweight享元模式 -- 结构型模式
说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...
- 代理模式/proxy模式/结构型模式
代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...
- 设计模式(十三): Proxy代理模式 -- 结构型模式
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...
- 设计模式学习之路——Facade 外观模式(结构型模式)
动机: 组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系 ...
- 设计模式(十一):FACADE外观模式 -- 结构型模式
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...
- 设计模式(十):Decorator装饰者模式 -- 结构型模式
1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...
- 设计模式(八):Bridge桥接模式 -- 结构型模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
- 设计模式(九):Composite组合模式 -- 结构型模式
1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对 ...
随机推荐
- php 微信登录 公众号 获取用户信息 微信网页授权
php 微信登录 公众号 获取用户信息 微信网页授权 先自己建立两个文件: index.php 和 getUserInfo.php index.php <?php //scope=snsap ...
- 1143 Lowest Common Ancestor
The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...
- uint8_t / uint16_t / uint32_t /uint64_t
这些数据类型是 C99 中定义的,它就是一个结构的标注,可理解为type/typedef的缩写,表示通过typedef定义.它们只是使用typedef给类型起的别名 #ifndef _UINT8_T ...
- js跳转页面方法实现汇总
一.页面之间的跳转传参 1.在页面之间跳转的方式有两种: window.location.href=”test.html?num=10” 地址会改变参数也会被传递但是不会打开新窗口 window. ...
- Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
- AngularJS $watch 性能杀手
双向绑定是AngularJS核心概念之一,它给我们带来了思维的转变,不再是以DOM为驱动,而是以Model为核心,View中写上声明式标签(指令或{{}}),AngularJS会在后台默默同步View ...
- Android-WebView与本地HTML (Java调用--->HTML的方法)-(new WebView(this)方式)
之前的博客,Android-WebView与本地HTML (Java调用--->HTML的方法),是在 findViewById(R.id.webview);,来得到WebView, 此博客使用 ...
- ASP.NET微信公众号用于给指定OpenId用户发送红包
ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...
- (C#)找的winform窗体自适应类
原文:https://www.cnblogs.com/gguozhenqian/p/4288451.html 需要添加引用System.Windows.Forms public class AutoS ...
- 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板
[源码下载] 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板 作者:webabcd 介绍背水一战 Windows 10 之 控件( ...