享元模式

博客介绍了享元模式,其运用共享技术减少内存占用,若有相同内容的实例,不再重新实例化,而是共享内存。享元模式分为内部状态和外部状态,还通过五子棋、网页设计等例子进行说明,强调了该模式可避免资源浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单介绍一下享元模式。一开始看到这个名字,我也不是很理解,为什么叫做“享元”模式,后来看了才明白是共享原物件的意思。

定义:

运用共享技术来减少内存的占用。如果有一个实例化的例子,然后再有一个和它一样内容的例子的话,就不再进行实例化,它可以和上一个例子共享内存。

它分为内部状态和外部状态:

内部状态:在享元对象内部不随外界环境改变而改变的共享部分。

外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

举个下五子棋的例子:

内部状态就是两个棋的颜色,外部状态是棋子的位置。如果没有享元模式的话,每走一步,都需要进行实例化,很浪费资源。

举设计模式中的例子:网页分为用户登录端和一些复用的内容,比如相同的功能。

用户端:

 public class User//用户类,是网站类的外部状态
    {
        private string name;
        public User(string name)
        {
            this.name = name;
        }
        public string Name
        {
            get { return name; }
        }
    }

网站抽象类和网站具体类:

 abstract class Website//网站抽象类
    {
        public abstract void Use(User user);
    }
    class ConcreteWebSite:Website
    {
        private string name = "";
        public ConcreteWebSite(string name)
        {
            this.name = name;
        }
        public override void Use(User user)
        {
            Console.WriteLine("网站分类:"+name+"用户:"+user.Name);
        }
    }

工厂类

 class WebsiteFactory
    {
        private Hashtable flyweights = new Hashtable();

        public Website GetWebSiteCategory(string key)
        {
            if (!flyweights.ContainsKey(key))
                flyweights.Add(key, new ConcreteWebSite(key));
            return ((Website)flyweights[key]);

        }
        public int GetWebSiteCount()
        {
            return flyweights.Count;
        }

    }

客户端:


        static void Main(string[] args)
        {
            WebsiteFactory f = new WebsiteFactory();
            Website fx = f.GetWebSiteCategory("产品展示");
            fx.Use(new User("小明"));
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            WebsiteFactory f = new WebsiteFactory();
            Website fx = f.GetWebSiteCategory("产品展示");
            fx.Use(new User("小红"));
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            WebsiteFactory f = new WebsiteFactory();
            Website fx = f.GetWebSiteCategory("博客");
            fx.Use(new User("小张"));
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            WebsiteFactory f = new WebsiteFactory();
            Website fx = f.GetWebSiteCategory("博客");
            fx.Use(new User("小李"));
            Console.ReadKey();
        }

分析:

此行代码:

public Website GetWebSiteCategory(string key)
        {
            if (!flyweights.ContainsKey(key))
                flyweights.Add(key, new ConcreteWebSite(key));
            return ((Website)flyweights[key]);

        }

如果没有“产品展示”,则实例化一个,如果有的话,再次遇到“产品展示”时则直接返回,不再重新实例化。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值