(超详细,超易懂)设计模式(十二):享元模式,唐三藏的徒弟们

如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!

一、简介

        享元模式是一种结构型设计模式,旨在最小化内存使用和提高性能。该模式通过共享对象的方式,将大量细粒度的对象共享使用,以减少创建对象的数量和保存对象的内存。

        在享元模式中,将对象分为两类:内部状态和外部状态。内部状态是不依赖于外部环境的对象状态,可以在多个对象之间共享。外部状态是依赖于外部环境的对象状态,每个对象都需要单独保存。

        享元模式中的享元工厂用于管理共享对象的创建和使用。当需要新的对象时,先检查工厂是否已经有符合条件的对象,如果有则返回已有对象,如果没有则创建新对象并添加到工厂中。

        使用享元模式可以有效地减少对象的数量和内存使用,特别适用于需要创建大量细粒度对象的场景。但是,由于共享对象是不可变的,因此需要确保共享对象在不同环境下的使用不会相互影响。

二、为什么要学习享元模式

        2.1 节省内存

        享元模式通过共享对象来减少内存的使用。在大量相似对象的情况下,通过共享相同的对象,可以显著减少内存的占用,提高系统的性能和效率。

        2.2 提高性能

        由于享元模式减少了对象的数量,因此可以减少资源的消耗和系统的负载,从而提高系统的性能。

        2.3 提高代码复用性

        享元模式允许共享对象在系统中多次重用,从而提高了代码的复用性。共享对象可以在不同的场景中使用,避免了重复创建相同对象的情况。

        2.4 简化系统设计

        享元模式提供了一个简单的方式来管理大量相似的对象。通过将对象的共享和非共享状态分离,可以简化系统的设计和实现。

三、享元模式在项目中有哪些实际应用

        3.1 字符串池

        在大量使用字符串的场景下,可以使用享元模式来共享相同的字符串对象,减少内存的占用。

        3.2 网页缓存

        在网页内容繁多的情况下,可以使用享元模式来缓存相同的网页内容,减少重复的内容加载。

        3.3 资源池

        在资源有限的情况下,可以使用享元模式来共享资源对象,提高资源的利用率。

        3.4 线程池

        在多线程环境下,可以使用享元模式来共享线程对象,减少线程的创建和销毁开销。

        3.5 游戏中的对象

        在游戏中,可以使用享元模式来共享相同的游戏对象,减少内存的消耗。

四、享元模式在代码中的实现与讲解

在C#中,可以通过享元模式来实现三藏的弟子场景。下面是一个简单的示例代码:

首先,我们需要定义一个享元接口(IFollower),该接口定义了弟子的行为方法:

public interface IFollower
{
    void Follow();
}

然后,我们实现具体的享元对象(具体弟子类):

public class Disciple : IFollower
{
    private string name;
    private string skill;

    public Disciple(string name, string skill)
    {
        this.name = name;
        this.skill = skill;
    }

    public void Follow()
    {
        Console.WriteLine($"{name}正在跟随三藏去西天取经");
    }
}

接下来,我们实现一个享元工厂(FollowerFactory),用来创建和管理弟子对象:

public class FollowerFactory
{
    private Dictionary<string, IFollower> followers = new Dictionary<string, IFollower>();

    public IFollower GetDisciple(string name, string skill)
    {
        string key = $"{name}-{skill}";

        if (followers.ContainsKey(key))
        {
            return followers[key];
        }
        else
        {
            IFollower disciple = new Disciple(name, skill);
            followers.Add(key, disciple);
            return disciple;
        }
    }
}

最后,我们可以在客户端代码中使用享元模式:

class Program
{
    static void Main(string[] args)
    {
        FollowerFactory factory = new FollowerFactory();

        IFollower disciple1 = factory.GetDisciple("悟空", "变化术");
        disciple1.Follow();

        IFollower disciple2 = factory.GetDisciple("八戒", "筋斗云");
        disciple2.Follow();

        IFollower disciple3 = factory.GetDisciple("沙僧", "火眼金睛");
        disciple3.Follow();
    }
}

输出结果:

悟空正在跟随三藏去西天取经
八戒正在跟随三藏去西天取经
沙僧正在跟随三藏去西天取经

        这样,我们就实现了使用享元模式来创建和管理三藏的弟子对象,避免了重复创建相同的对象,提高了内存利用率。

五、享元模式需要注意的地方

        5.1 共享对象的状态必须是内部状态

        享元模式将对象的状态分为内部状态和外部状态,内部状态可以被共享,而外部状态不能被共享。因此,需要将对象的状态划分清楚,确保内部状态可以被共享。

        5.2 管理共享对象的工厂必须是线程安全的

        由于共享对象可能被多个线程同时使用,因此共享对象的工厂必须是线程安全的,能够正确处理并发访问的情况。

        5.3 对象的可变性要注意

        共享对象通常是不可变的,即一旦创建就不能再修改其内部状态。如果需要修改共享对象的状态,应该创建一个新的对象来代替原来的对象。

        5.4 使用场景要合适

        享元模式适用于存在大量重复对象的场景,通过共享对象来减少内存的使用。如果对象数量较少或者没有重复的对象,使用享元模式可能没有明显的优势。因此,需要根据具体的业务场景来判断是否适合使用享元模式。

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值