.Net结构型设计模式之享元模式(Flyweight)

 更新时间:2022年05月25日 16:09:05   作者:springsnow  
这篇文章介绍了.Net结构型设计模式之享元模式(Flyweight),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

一、动机(Motivate)

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

二、意图(Intent)

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

三、结构图(Structure)

四、模式的组成

(1)、抽象享元角色(Flyweight):此角色是所有的具体享元类的基类,为这些类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用方法以参数形式传入。
(2)、具体享元角色(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义。
(3)、享元工厂角色(FlyweightFactory):本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享,当一个客户端对象调用一个享元对象的时候,享元工厂角色检查系统中是否已经有一个符合要求的享元对象,如果已经存在,享元工厂角色就提供已存在的享元对象,如果系统中没有一个符合的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。
(4)、客户端角色(Client):本角色需要存储所有享元对象的外部状态。

五、享元模式的具体代码实现

/// <summary>
/// 享元的抽象类
/// </summary>
public abstract class Flyweight
{
    public abstract void Operation(int extrinsicState);
}
/// <summary>
/// 需要共享的具体类
/// </summary>
public class ConceteFlyweight : Flyweight
{
    public override void Operation(int extrinsicState)
    {
        Console.WriteLine("需要共享的具体Flyweight类:" + extrinsicState);
    }
}
/// <summary>
/// 不需要共享的具体类
/// </summary>
public class UnsharedConcreteFlyeight : Flyweight
{
    public override void Operation(int extrinsicState)
    {
        Console.WriteLine("不需要共享的具体Flyweight类:" + extrinsicState);
    }
}
/// <summary>
/// 一个工厂类,用来合理创建对象
/// </summary>
public class FlyweightFactory
{
    private Dictionary<string, Flyweight> dic = new Dictionary<string, Flyweight>();
    public Flyweight GetFlyweight(string key, bool type)
    {
        if (!dic.ContainsKey(key))
        {
            Flyweight flyweight = new UnsharedConcreteFlyeight();
            if (type)
                flyweight = new ConceteFlyweight();
            dic.Add(key, flyweight);
        }
        return (Flyweight)dic[key];
    }
}
/// <summary>
/// 客户端调用
/// </summary>
public class App
{
    static void Main()
    {
        int extrinsicState = 26;
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight f1 = factory.GetFlyweight("oec2003", true);
        f1.Operation(++extrinsicState);
        Flyweight f2 = factory.GetFlyweight("oec2003", true);
        f2.Operation(++extrinsicState);
        Flyweight f3 = factory.GetFlyweight("oec2004", false);
        f3.Operation(++extrinsicState);
    }
}

六、享元模式的实现要点:

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

1、享元模式的优点

(1)、享元模式的优点在于它能够极大的减少系统中对象的个数。
(2)、享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。

2、享元模式的缺点

(1)、由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。
(2)、为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变化。

3、在下面所有条件都满足时,可以考虑使用享元模式:

(1)、一个系统中有大量的对象;
(2)、这些对象耗费大量的内存;
(3)、这些对象中的状态大部分都可以被外部化;
(4)、这些对象可以按照内部状态分成很多的组,当把外部对象从对象中剔除时,每一个组都可以仅用一个对象代替软件系统不依赖这些对象的身份,满足上面的条件的系统可以使用享元模式。但是使用享元模式需要额外维护一个记录子系统已有的所有享元的表,而这也需要耗费资源,所以,应当在有足够多的享元实例可共享时才值得使用享元模式。

七、.NET 中享元模式的实现

.NET在C#中有一个Code Behind机制,它表面有一个aspx文件,背后又有一个cs文件,它的编译过程实际上会把aspx文件解析成C#文件,然后编译成dll,在这个过程中,我们在aspx中写的任何html代码都会转化为literal control,literal control是一个一般的文本控件,它就表示html标记。当这些标记有一样的时候,构建控件树的时候就会用到Flyweight模式。
它的应用并不是那么平凡,只有在效率空间确实不高的时候我们才用它。

到此这篇关于.Net结构型设计模式之享元模式(Flyweight)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • .Net Core使用SignalR实现斗地主游戏

    .Net Core使用SignalR实现斗地主游戏

    本文详细讲解了.Net Core使用SignalR实现斗地主游戏的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Linux?CentOS下docker部署Asp.Net?Core(.Net6)

    Linux?CentOS下docker部署Asp.Net?Core(.Net6)

    这篇文章介绍了Linux?CentOS下docker部署Asp.Net?Core(.Net6)的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Json.Net6.0用法介绍

    Json.Net6.0用法介绍

    这篇文章介绍了Json.Net6.0的用法,对大家的学习或者工作具有一定的参考学习价值。需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12
  • ASP.NET中Cookie的使用方法

    ASP.NET中Cookie的使用方法

    Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一。浏览器对 Cookie 的大小有限制,因此,只有不超过 4096 字节才能保证被接受。
    2016-04-04
  • .Net?Core部署Docker容器

    .Net?Core部署Docker容器

    这篇文章介绍了.Net?Core部署Docker容器的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • ASP.NET?Core的中间件与管道介绍

    ASP.NET?Core的中间件与管道介绍

    这篇文章介绍了ASP.NET?Core的中间件与管道,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 搭建基础结构的ABP解决方案介绍

    搭建基础结构的ABP解决方案介绍

    这篇文章介绍了搭建基础结构的ABP解决方案的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • .Net中Task Parallel Library的基本用法

    .Net中Task Parallel Library的基本用法

    这篇文章介绍了.Net中Task Parallel Library的基本用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • .Net?6简介并和之前版本写法做对比

    .Net?6简介并和之前版本写法做对比

    这篇文章介绍了.Net?6简介并和之前版本写法做对比,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • ASP.NET?Core中的Razor页面介绍

    ASP.NET?Core中的Razor页面介绍

    这篇文章介绍了ASP.NET?Core中的Razor页面,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02

最新评论

?


http://www.vxiaotou.com