首页 > 编程语言 > C#设计模式10——享元模式的写法

C#设计模式10——享元模式的写法

时间:2023-05-09 21:22:09浏览次数:36  
标签:享元 10 状态 对象 color 圆形 circle 设计模式

1. 什么是享元模式?

享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量。它通过将对象分为可共享的和不可共享的来实现这一目的。

2. 为什么要使用享元模式?

使用享元模式可以大大减少系统中对象的数量,从而减少了内存的使用。在对象数量较大,且需要相同状态的对象在内存中存在多个实例时,使用享元模式可以提高系统的性能和内存的使用效率。

3. 享元模式的核心思想是什么?

享元模式的核心思想是将对象分为内部状态和外部状态。内部状态是可以被共享的,而外部状态则需要在使用时进行传递。通过将内部状态共享,可以减少系统中相同状态对象的数量。

4. 什么是内部状态和外部状态?

内部状态是与对象的其余状态无关的状态,它可以被共享。外部状态则是与对象的其余状态有关的状态,需要在使用时单独传递。

5. 享元模式有哪些应用场景?

享元模式常用于大规模创建相同或相似对象的场景,例如线程池、缓存池以及字符串池等。此外,它还可以用于减少系统中相同状态对象的数量,提高系统性能和内存使用效率。

6. 享元模式的优点和缺点是什么?

享元模式的优点包括减少对象数量,提高系统性能和内存使用效率,同时降低代码复杂度。缺点则是由于需要将对象分为内部状态和外部状态,因此可能需要增加代码的复杂性。此外,由于共享对象可能被多个客户端同时使用,因此在开发过程中需要特别注意线程安全问题。

 

下面是一个简单的C#代码示例,演示了如何使用享元模式来创建和共享相同状态的对象:

using System.Collections.Generic;

// 定义享元对象接口
public interface IShape
{
    void Draw();
}

// 实现具体的享元对象类
public class Circle : IShape
{
    private string color;

    public Circle(string color)
    {
        this.color = color;
    }

    public void Draw()
    {
        Console.WriteLine("Drawing a " + color + " circle.");
    }
}

// 定义享元工厂类
public class ShapeFactory
{
    private Dictionary<string, IShape> circleMap = new Dictionary<string, IShape>();

    public IShape GetCircle(string color)
    {
        // 如果已经有相同颜色的圆形,直接返回
        if (circleMap.ContainsKey(color))
        {
            return circleMap[color];
        }

        // 否则创建新的圆形并将其放入字典中
        Circle circle = new Circle(color);
        circleMap.Add(color, circle);
        Console.WriteLine("Creating a " + color + " circle.");
        return circle;
    }
}

// 客户端代码
class Client
{
    static void Main(string[] args)
    {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 获取红色圆形
        IShape redCircle = shapeFactory.GetCircle("Red");
        redCircle.Draw();

        // 获取绿色圆形
        IShape greenCircle = shapeFactory.GetCircle("Green");
        greenCircle.Draw();

        // 再次获取红色圆形
        IShape redCircle2 = shapeFactory.GetCircle("Red");
        redCircle2.Draw();
    }
}

在这个示例中,我们创建了一个ShapeFactory类作为享元工厂,通过GetCircle方法可以获取具有相同颜色的圆形对象。如果之前已经有了相同颜色的圆形,那么就可以直接返回之前的对象,否则就创建新的圆形对象并将其加入到一个字典中进行共享。客户端代码则演示了如何使用这个工厂类来获取圆形对象,并绘制它们。

输出如下:

```
Creating a Red circle.
Drawing a Red circle.
Creating a Green circle.
Drawing a Green circle.
Drawing a Red circle.
``` 

这个示例中我们只创建了两个圆形对象:一个红色的和一个绿色的。当我们需要再次创建红色的圆形时,享元工厂检测到已经有一个红色的圆形对象,并直接返回之前的对象。这样就可以减少对象的创建数量,提高内存使用效率。

标签:享元,10,状态,对象,color,圆形,circle,设计模式
From: https://www.cnblogs.com/for-easy-fast/p/17386343.html

相关文章

  • C#设计模式08——桥接模式的写法
    什么是C#桥接模式?桥接模式是一种结构型设计模式,它可以将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过将实现细节从抽象类中分离出来,从而让它们可以根据需要独立变化。为什么要使用C#桥接模式?C#桥接模式的主要目的是使系统更加灵活,容易扩展和维护,同时避免类之间的紧......
  • C#设计模式07——装饰器模式的写法
    装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。以下是5W1H分析:What(什么)?装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代......
  • 10. 列表
    列表是可变的1.1什么是列表一个排列整齐的队伍,Python采用顺序表实现列表内的个体称作元素,由若干元素组成列表元素可以是任意对象(数字、字符串、对象、列表等)列表内元素有顺序,可以使用索引线性的数据结构使用[]表示列表是可变的1.2列表的构造ls1=[]ls2=li......
  • ASEMI代理ADI亚德诺LT6230CS6-10#TRPBF车规级芯片
    编辑-ZLT6230CS6-10#TRPBF特点:低噪声电压:1.1nV/√Hz低电源电流:3.5mA/Amp(最大值)低失调电压:350μV(最大值)增益带宽积:LT6230:215MHz;V≥1__LT6230-10:1450MHz;V≥10__宽电源范围:3V至12.6V轨到轨输出摆幅共模抑制比:115dBTyp输出电流:30mA工作温度范围:–40°C至85°CL......
  • 计讯物联环保数采仪TS910在扬尘预警监测解决方案的应用
    方案背景随着我国经济高速发展和城市化进程的加速,城市建设工程规模不断扩大,工程施工给居住区、学校、医院等周边环境带来了巨大的影响,特别是扬尘污染带来的细颗粒物,严重危害到人体健康和大气环境质量。 因此,计讯物联以可持续发展为设计理念,践行国家“双碳”发展战略,实力打造稳......
  • 1000个已成功入职的软件测试工程师简历经验总结:软件测试工程师简历项目经验怎么写?(含
    一、前言:浅谈面试 面试是我们进入一个公司的门槛,通过了面试才能进入公司,你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试,得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一下笔者十年测试生涯的面试总结!软件测试面试常......
  • Nessus 10.5 Auto Install for macOS Ventura(自动化安装 Nessus 试用版)
    发布Nessus试用版自动化安装程序,支持macOSVentura、RHEL9和Ubuntu22.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-macos/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgNessus简介Nessus漏洞评估领域的全球黄金标准针对现代攻击面......
  • NetBackup 10.2 新功能介绍:PostgreSQL 和 MySQL 自动化恢复达成
    原文来自:VERITAS中文社区2023-04-27在执行恢复任务时,手动提取、更新数据库和实例并将其附加到PostgreSQL和MySQL是常规操作。而在最新的NetBackup10.2版本中,执行恢复已不再需要上述手动流程,PostgreSQL和MySQL数据库的备份恢复变得更加便捷、高效。正所谓:NetBackup......
  • COSC1076 Vending机器
    COSC1076|Semester12023AdvancedProgrammingTechniquesAssignment2VendingMachineAssessmentType:Bothgroupandindividualassessments.Weight:40%ofthefinalcoursemarkDueDate:23:59,Friday26May2023(Notethatthereisalsoagroupdemonstrat......
  • centos(linux):yum报错:removing mirrorlist with no valid mirrors的处理(centos 6.1
    一,报错[root@osc~]#yuminstall-ypython3-pipLoadedplugins:fastestmirror,securitySettingupInstallProcessDeterminingfastestmirrorsYumRepoError:AllmirrorURLsarenotusingftp,http[s]orfile.Eg.Invalidrelease/repo/archcombination/rem......