广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.Net结构型设计模式之享元模式(Flyweight)
  • 435
分享到

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

2024-04-02 19:04:59 435人浏览 独家记忆
摘要

目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、享元模式的具体代码实现六、享元模式的实现要点:1、享元模式的优点2、享元模式

一、动机(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)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: .Net结构型设计模式之享元模式(Flyweight)

本文链接: https://www.lsjlt.com/news/149715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .Net结构型设计模式之享元模式(Flyweight)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、享元模式的具体代码实现六、享元模式的实现要点:1、享元模式的优点2、享元模式...
    99+
    2022-11-13
  • .Net结构型设计模式之享元模式怎么实现
    这篇文章主要介绍了.Net结构型设计模式之享元模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之享元模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
    99+
    2023-06-30
  • Python设计模式结构型享元模式
    目录一、享元模式二、应用场景三、代码示例一、享元模式 享元,可理解为 Python 中的元类、最小粒度的类,系统中存在大量的相似对象时,可以选择享元模式提高资源利用率。 享元具有两种...
    99+
    2022-11-13
  • .Net结构型设计模式之桥接模式(Bridge)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、桥接模式的具体代码实现六、桥接模式的实现要点:1、桥接模式的优点:2、桥接...
    99+
    2022-11-13
  • .Net结构型设计模式之装饰模式(Decorator)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五 、装饰模式的具体代码实现六、装饰模式的实现要点:1、装饰模式的优点:2、装饰...
    99+
    2022-11-13
  • .Net结构型设计模式之组合模式(Composite)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、组合模式的具体代码实现1、透明式的组合模式2、安全式的组合模式六、组合模式的...
    99+
    2022-11-13
  • .Net结构型设计模式之外观模式(Facade)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、外观模式的具体实现六、实现要点:1、外观模式的优点:2、外观模式的缺点:3、...
    99+
    2022-11-13
  • .Net结构型设计模式之代理模式(Proxy)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、代理模式的分类:六、代理模式的具体实现七、代理模式的实现要点:1、代理模式的...
    99+
    2022-11-13
  • Java结构型设计模式之享元模式示例详解
    目录享元模式概述目的应用场景优缺点主要角色享元模式结构内部状态和外部状态享元模式的基本使用创建抽象享元角色创建具体享元角色创建享元工厂客户端调用总结享元模式实现数据库连接池创建数据库...
    99+
    2022-11-13
  • .Net结构型设计模式之适配器模式(Adapter)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)1、对象适配器(更常用)2、类适配器(不推荐使用)四、模式的组成五、 适配器模式的具体实现六...
    99+
    2022-11-13
  • js设计模式之结构型享元模式的示例分析
    小编给大家分享一下js设计模式之结构型享元模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!运用共享技术有效地支持大量...
    99+
    2022-10-19
  • PHP结构型模式之享元模式详解
    目录享元模式(Flyweight Pattern)是什么享元模式的优点享元模式的实现享元模式的使用总结享元模式(Flyweight Pattern)是什么 享元模式是一种结构型模式,...
    99+
    2023-05-15
    PHP享元模式 PHP结构型模式
  • .Net结构型设计模式之组合模式怎么实现
    今天小编给大家分享一下.Net结构型设计模式之组合模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、动机(Mot...
    99+
    2023-06-30
  • .Net结构型设计模式之装饰模式怎么实现
    这篇文章主要介绍“.Net结构型设计模式之装饰模式怎么实现”,在日常操作中,相信很多人在.Net结构型设计模式之装饰模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net结构型设计模式之装饰模式怎...
    99+
    2023-06-30
  • .Net结构型设计模式之桥接模式怎么实现
    本篇内容介绍了“.Net结构型设计模式之桥接模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、动机(Motivation)在很多...
    99+
    2023-06-30
  • .Net结构型设计模式之代理模式怎么实现
    这篇文章主要介绍了.Net结构型设计模式之代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
    99+
    2023-06-30
  • .Net结构型设计模式之适配器模式怎么实现
    本文小编为大家详细介绍“.Net结构型设计模式之适配器模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“.Net结构型设计模式之适配器模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、动机(...
    99+
    2023-06-30
  • Java设计模式之享元模式
    本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。 读者可以拉取完整代码到本地进行学习,实现代码均测试...
    99+
    2022-11-13
  • javascript设计模式之享元模式
    目录一. 认识享元模式二. 代码具体实现1. 不使用享元模式实现上述案例2. 使用享元模式重构上述代码3. 享元模式的状态三. 享元模式实际应用扩展:再谈内部状态和外部状态四. 对象...
    99+
    2022-11-12
  • PHP结构型模式之享元模式怎么实现
    这篇文章主要讲解了“PHP结构型模式之享元模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP结构型模式之享元模式怎么实现”吧!享元模式(Flyweight Pattern)是什...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作