享元模式(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. 【Java】常用POI生成Excel文档设置打印样式

    package poi_test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi ...

  2. Remember the Word UVALive - 3942(dp+trie)

    题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好 ...

  3. macvtap介绍

    macvtap介绍 传统的linux网络虚拟化技术采用的是tap+bridge方式,将虚拟机连接到虚拟的tap网卡,然后将tap网卡加入到bridge.bridge相当于用软件实现的交换机,这种解决方 ...

  4. 导航控制器里边添加UIScrollView (automaticallyAdjustsScrollViewInsets)

    导航控制器里边如果添加UIScrollView会导致放大操作异常怪异,此时设置 self.automaticallyAdjustsScrollViewInsets = false

  5. 【Loj#535】花火(线段树,扫描线)

    [Loj#535]花火(线段树,扫描线) 题面 Loj 题解 首先如果不考虑交换任意两个数这个操作,答案就是逆序对的个数. 那么暴力就是枚举交换哪个两个数,然后用数据结构之类的东西动态维护逆序对. 但 ...

  6. 2017-2018-2 20165218 实验四《Android开发基础》实验报告

    实验三 Android开发基础 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.14 实验内容: 1.基于Android Studio开发简单的 ...

  7. 【bzoj1029】【JSOI2007】建筑抢修

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 6417  Solved: 2883[Submit][Statu ...

  8. [ldap]slapcat/ldapsearch与ldap备份

    http://serverfault.com/questions/577356/ldap-backup-with-slapcat-vs-ldapsearch Used: openldap-server ...

  9. 前端PHP入门-031-文件上传-六脉神剑

    php.ini的设置 php.ini的文件太多,找不到的时候你可以使用 Ctrl+F 搜索相关配置项. 配置项 功能说明 file_uploads on 为开启文件上传功能,off 为关闭 post_ ...

  10. 前端PHP入门-012-回调函数[慎入]

    尽力而为,对于WEB前端和美工同学,比较难了!但是你们都学过JS的闭包等操作,那么这里也一定没有问题! 回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构. 回调函数,就是在处理一个 ...