享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,用于在系统中共享大量相似对象,以减少内存占用和提高性能。享元模式通过共享相同或相似的对象,避免了创建过多的对象实例,从而降低了系统的开销。

以下是一个使用C#语言实现的享元模式的示例:

假设我们有一个图形绘制系统,需要绘制大量的圆形对象。每个圆形对象具有相同的属性和行为,只是位置和大小不同。为了优化性能和减少内存占用,我们可以使用享元模式来共享这些相似对象。

using System;  
using System.Collections.Generic;  
  
namespace FlyweightPatternExample  
{  
    // 圆形对象接口  
    public interface ICircle  
    {  
        void Draw();  
    }  
  
    // 具体圆形对象类  
    public class ConcreteCircle : ICircle  
    {  
        private int _x;  
        private int _y;  
        private int _radius;  
  
        public ConcreteCircle(int x, int y, int radius)  
        {  
            _x = x;  
            _y = y;  
            _radius = radius;  
        }  
  
        public void Draw()  
        {  
            Console.WriteLine($"Drawing circle at ({_x}, {_y}) with radius {_radius}");  
        }  
    }  
  
    // 圆形对象享元工厂类  
    public class CircleFlyweightFactory  
    {  
        private Dictionary<string, ICircle> _circlePool;  
  
        public CircleFlyweightFactory()  
        {  
            _circlePool = new Dictionary<string, ICircle>();  
        }  
  
        public ICircle GetCircle(int x, int y, int radius)  
        {  
            string key = $"{x}_{y}_{radius}"; // 根据对象的属性值生成唯一的键  
            if (!_circlePool.ContainsKey(key)) // 如果对象不存在于池中,则创建并添加到池中  
            {  
                _circlePool[key] = new ConcreteCircle(x, y, radius);  
            }  
            return _circlePool[key]; // 返回池中的对象实例  
        }  
    }  
}

使用示例:

class Program  
{  
    static void Main(string[] args)  
    {  
        CircleFlyweightFactory factory = new CircleFlyweightFactory(); // 创建享元工厂对象  
        ICircle circle1 = factory.GetCircle(100, 100, 50); // 获取或创建圆形对象实例1(x=100, y=100, radius=50)  
        circle1.Draw(); // 绘制圆形对象实例1,输出结果:Drawing circle at (100, 100) with radius 50  
        ICircle circle2 = factory.GetCircle(200, 200, 50); // 获取或创建圆形对象实例2(x=200, y=200, radius=50)  
        circle2.Draw(); // 绘制圆形对象实例2,输出结果:Drawing circle at (200, 200) with radius 50  
        ICircle circle3 = factory.GetCircle(100, 100, 50); // 获取或创建圆形对象实例3(x=100, y=100, radius=50),与实例1属性值相同,应该返回同一个实例  
        circle3.Draw(); // 绘制圆形对象实例3,输出结果:Drawing circle at (100, 100) with radius 50,与实例1的输出结果相同,证明是同一个实例。        
        Console.ReadLine(); // 等待用户输入,防止程序直接退出。    
    }  
}

在上面的示例中,我们创建了一个圆形对象享元工厂类CircleFlyweightFactory

它内部维护了一个存储圆形对象的池。

当客户端请求获取或创建一个圆形对象时,工厂类会根据对象的属性值生成一个唯一的键,

并在池中查找是否存在具有相同属性的对象。

如果找到了,则返回该对象的引用;

如果没有找到,则创建一个新的对象添加到池中,并返回该对象的引用。

这种方式实现了对相似对象的共享,减少了内存占用并提高了性能。



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-30 16:51:19 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864