享元模式(Flyweight)

定义

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

类图

描述

Flyweight:抽象享元类,是所有的具体享元类的基类,为子类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用Flyweight的方法并以参数的形式传入。

ConcreteFlyweight:具体享元类,实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义。

FlyweightFactory:享元工厂,用来创建和管理享元对象,主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

内部状态:是指在享元对象内部并且不会随环境改变而改变的共享部分,内部状态存储于ConcreteFlyweight对象中;

外部状态:是指随环境改变而改变、不可以共享的部分,外部状态存储于外部对象中,当调用Flyweight对象的操作时,将外部状态传递给Flyweight对象。

享元模式可以看作是一种最简单的缓存技术的实现。

应用场景

    public class Student
{
private string name; public string Name
{
get { return name; }
} public Student(string name)
{
this.name = name;
}
} public abstract class AbstractCourse
{
public abstract void Print(Student student);
} public class Course : AbstractCourse
{
/// <summary>
/// 课程名称
/// </summary>
private string name; /// <summary>
/// 课时
/// </summary>
private int periods; public Course(string name, int periods)
{
this.name = name;
this.periods = periods;
} public override void Print(Student student)
{
Console.WriteLine(student.Name + ":\t" + this.name + "(" + this.periods + "课时)");
}
} public class CourseFactory
{
private Dictionary<string,Course> courses = new Dictionary<string,Course>(); /// <summary>
/// 获取课程
/// </summary>
/// <param name="name"></param>
/// <param name="periods"></param>
/// <returns></returns>
public Course GetCourse(string name, int periods)
{
if (!this.courses.ContainsKey(name)) //如果不存在相应的课程就新建一个课程实例
{
courses.Add(name, new Course(name, periods));
}
return this.courses[name];
} /// <summary>
/// 获取开课总数
/// </summary>
/// <returns></returns>
public int GetCourseCount()
{
Console.WriteLine("开课总数:" + this.courses.Count);
return this.courses.Count;
}
}

享元模式和单例模式的区别:

享元是对象级别的, 即多个相同的对象在共享区里只保存一个对象;

单例是类级别的, 即该类只能实例化出来一个对象。

设计模式之笔记--享元模式(Flyweight)的更多相关文章

  1. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 设计模式 笔记 享元模式 Flyweight

    //---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1 ...

  3. 设计模式学习心得<享元模式 Flyweight>

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  4. 《JAVA设计模式》之享元模式(Flyweight)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ...

  5. 学习笔记——享元模式Flyweight

    Flyweight模式提供对象的复用. FlyweightFactory类似工厂模式中的工厂,生成对象并提供. 区别在于,享元的工厂会记录生成的对象,当第二次请求到相同的对象时,享元不会再生成一个新对 ...

  6. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  7. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  8. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

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

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

随机推荐

  1. 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法

    题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...

  2. C++解析(26):函数模板与类模板

    0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...

  3. Qt的编程风格与规范

    Qt的编程风格与规范 来源: http://blog.csdn.net/qq_35488967/article/details/70055490 参考资料: https://wiki.qt.io/Qt ...

  4. 转:评估指标MAP

    转:http://www.zhenv5.com/?p=1079 MAP可以由它的三个部分来理解:P,AP,MAP 先说P(Precision)精度,正确率.在信息检索领域用的比较多,和正确率一块出现的 ...

  5. Tajo--一个分布式数据仓库系统(分布式环境安装试用)

    前面两篇介绍了一下tajo,下面就说一下安装和使用吧. 一.分布式安装 前提:hadoop2中的hdfs和yarn已经安装并运行正常. 1.下载source并build源码 $git clone ht ...

  6. 获取AD域中SYSVOL和组策略首选项中的密码

    这种方法是最简单的,因为不需要特殊的“黑客”工具.所有的攻击必须做的是打开Windows资源管理器,并搜索域名为SYSVOL DFS共享的XML文件.在大多数情况下,以下XML文件将包含凭据:grou ...

  7. 全面支持Angular2的Web后台Bootstrap模板Sing App - Web & Angular 2.0 Dashboard

    在线预览 Sing App v3.3.0 (包含Angular 2.0版本实现) 现在,本模板完全支持Angular2.0版本啦. Sing Web App 是由专业前端工程师采用行业内流行的技术构建 ...

  8. OA项目中的论坛模块设计与实现

    1.论坛是什么?论坛与贴吧有什么区别? 简单的说论坛和贴吧都是发表言论和讨论的一个平台. 贴吧是论坛的一个部分. 2.关于论坛模块的需求分析? 首先我们看看论坛的几个设计页面: 这个主要是论坛的版块设 ...

  9. 个人最常用的vim操作

    本文只记录个人工作中最常用到的vim快捷键,不是很全,但是已经覆盖了绝大多数功能. 参考:<鸟哥Linux私房菜>以及https://www.cnblogs.com/momofan/p/5 ...

  10. javaFX8初探(环境搭建)

    1:下载java8  Oracle官网2:下载eclipse4.4 eclipse官网3:安装e(fx)clipse插件 http://download.eclipse.org/efxclipse/u ...