.NET高级面试指南专题二十七【享元模式介绍,通过共享对象来最大程度地减少内存使用和提高性能】

享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。

在享元模式中,对象被分为两种部分:内部状态(intrinsic state)和外部状态(extrinsic state)。内部状态是对象共享的部分,而外部状态是对象的变化部分,它们在对象被创建后可以被改变。

下面是享元模式的一些优点和缺点:

优点:

  • 节省内存:通过共享对象,可以减少系统中的内存占用。
  • 提高性能:减少对象的数量可以提高系统的性能,尤其是在需要大量相似对象时。
  • 简化对象的创建:通过享元工厂(Flyweight Factory)来管理共享对象的创建,可以简化对象的创建过程。

缺点:

  • 复杂性增加:引入了内部状态和外部状态的概念,增加了系统的复杂性。
  • 对象状态共享:共享对象的状态可能会导致对象之间的相互影响,需要额外的逻辑来管理状态的改变。
  • 不适合所有情况:并不是所有对象都适合被共享,有时候会因为共享而增加系统的复杂性。

演示代码:

csharp 复制代码
using System;
using System.Collections.Generic;

// 享元接口
interface IShape
{
    void Draw(string color);
}

// 具体享元类
class Circle : IShape
{
    private string _name;

    public Circle(string name)
    {
        this._name = name;
    }

    public void Draw(string color)
    {
        Console.WriteLine($"Drawing {_name} with color {color}");
    }
}

// 享元工厂
class ShapeFactory
{
    private Dictionary<string, IShape> _shapes = new Dictionary<string, IShape>();

    public IShape GetShape(string name)
    {
        if (!_shapes.ContainsKey(name))
        {
            _shapes[name] = new Circle(name);
        }
        return _shapes[name];
    }
}

class Program
{
    static void Main(string[] args)
    {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 绘制红色圆形
        IShape circle1 = shapeFactory.GetShape("Circle");
        circle1.Draw("Red");

        // 绘制蓝色圆形
        IShape circle2 = shapeFactory.GetShape("Circle");
        circle2.Draw("Blue");

        // 绘制绿色圆形
        IShape circle3 = shapeFactory.GetShape("Circle");
        circle3.Draw("Green");
    }
}

Circle 类表示具体的享元类,ShapeFactory 类是享元工厂,负责创建并管理共享的对象。通过共享相同的圆形对象,可以减少内存使用和提高性能。

相关推荐
考研保研资料分享12 小时前
新闻传播保研经验:中传预推免面试、广告学代表作与实习准备(2025)
面试·职场和发展
智码看视界16 小时前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针
触底反弹18 小时前
🎯 LangSmith 学习与面试全攻略:从 Agent「盲盒」到全链路观测与量化评估
人工智能·面试
一tiao咸鱼18 小时前
还在手动海投?我做了个 AI 求职助手,自动筛选 BOSS 职位再精准投递
前端·后端·面试
考研保研资料分享21 小时前
通信工程保研经验合辑:北航、北理工申请与夏令营、预推免面试(2025)
面试·职场和发展
熊猫钓鱼>_>21 小时前
大学图论第 6 讲:网络流与二分图匹配——对偶性让瓶颈自己现形
开发语言·算法·面试·职场和发展·图论·校招·面经
xuxigifxfh1 天前
面试记录2026
java·mysql·面试·职场和发展
丑陋小蚊子1 天前
校招没有实习,社团活动和课程项目先写哪个?
面试·求职招聘·大学生·简历·简历下载
Rain的Java大神之路1 天前
Java PDF导出,90%的人选错库!11个生产坑+选型+代码,一次讲透
java·后端·面试
怕浪猫1 天前
AI Agent 的安全怎么保障?面试最后一关的终极问题
算法·面试·github