博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习笔记-享元模式
阅读量:5251 次
发布时间:2019-06-14

本文共 2346 字,大约阅读时间需要 7 分钟。

概述:                                                                                                       

享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

适用场合:                                                                                                 

1.一个应用程序使用了大量的对象。

2.完全由大量的对象,造成很大的存储开销。

3.对象的大多数状态都可变为外部状态。

4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

5.应用程序不依赖于对象标识,由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

类图:                                                                                                       

代码示例:                                                                                                 

1.享元类的超类或者接口

///  /// 具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于 /// 外部状态 ///      abstract class Flyweight     {
public abstract void Operation(int extrinsicstate); }

2.实现Flyweight接口

///  /// 实现Flyweight接口,并为内部状态增加存储空间 ///      class ConcreteFlyweight:Flyweight     {
public override void Operation(int extrinsicstate) {
Console.WriteLine("具体Flyweight:"+extrinsicstate); } }

3.不需要共享的Flyweight子类

///  /// 不需要共享的Flyweight子类,因为Flyweight接口共享成为可能 /// 但它并不强制共享 ///      class UnsharedConcreteFlyweight:Flyweight     {
public override void Operation(int extrinsicstate) {
Console.WriteLine("不共享的具体Flyweight:"+extrinsicstate); } }

4.享元工厂

///  /// 享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享 /// Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象 /// 提供一个已创建的实例或者创建一个 ///      class FlyweightFactory     {
private Hashtable flyweights = new Hashtable(); /// /// 初始化工厂时先生成三个实例 /// public FlyweightFactory() {
flyweights.Add("X",new ConcreteFlyweight()); flyweights.Add("Y",new ConcreteFlyweight()); flyweights.Add("Z",new ConcreteFlyweight()); } /// /// 根据客户端请求生成的实例 /// /// ///
public Flyweight GetFlyweight(string key) {
return (Flyweight)flyweights[key]; } }

6.客户端调用

///  /// 测试享元模式 ///          static void TestFlyweight()         {
//外部状态 int extrinsisctate = 22; FlyweightFactory f = new FlyweightFactory(); Flyweight fx = f.GetFlyweight("X"); fx.Operation(--extrinsisctate); Flyweight fy = f.GetFlyweight("Y"); fy.Operation(--extrinsisctate ); Flyweight fz = f.GetFlyweight("Z"); fz.Operation(--extrinsisctate); UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight(); uf.Operation(--extrinsisctate); Console.Read(); }

小结:                                                                                                    

享元模式是用来节省内存开销的,我们不需要重复实例化得到一个相同的对象,只需共享这个对象就行了。

享元模式的延伸意义就是对象池(Object Pool),通过池子来取得对象实例,而不需要每一次去实例化这个对象,池子中有现成的。

转载于:https://www.cnblogs.com/jqbird/archive/2011/09/06/2168482.html

你可能感兴趣的文章
学习Redux之分析Redux核心代码分析
查看>>
ABAP 创建和调用WebService
查看>>
C# 实例化顺序
查看>>
CSS水平垂直居中总结
查看>>
委托又给我惹麻烦了————记委托链的取消注册、获取返回值
查看>>
ps怎么把白色背景变透明
查看>>
gource 安装教程
查看>>
字符串转 Boolean 的正确方式
查看>>
给你的网站404页面加上“宝贝寻亲”公益页面
查看>>
整理推荐的CSS属性书写顺序
查看>>
协程, IO阻塞模型 和 IO非阻塞模型
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>
Crontab 在linux中的非常有用的Schedule Jobs
查看>>
ProxySQL Scheduler
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>