享元模式(FlyWeight)

简介

享元模式,运用共享技术有效地支持大量细粒度的对象。享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。


书中实例

小菜最近接了几个小型外包项目,主要是给一些私营业主做网站。事实上很多客户都需要这样的网站,但要求不太一样,有的人希望是新闻发布形式,有人希望是博客形式。可是每个网站租用一个空间,费用上很难降低。万能的大鸟今天来教他享元模式,帮他解决这一问题。


享元模式实现程序

    //网站抽象类
    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);
        }
    }
    //用户
    public class User
    {
        private string name;
        public User(string name)
        {
            this.name = name;
        }

        public string Name
        {
            get { return 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;
        }
    }
    //客户端
    class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory f = new WebSiteFactory();

            WebSite fx = f.GetWebSiteCategory("产品展示");
            fx.Use(new User("小菜"));

            WebSite fy = f.GetWebSiteCategory("产品展示");
            fy.Use(new User("大鸟"));

            WebSite fl = f.GetWebSiteCategory("产品展示");
            fl.Use(new User("倩倩"));

            WebSite fm = f.GetWebSiteCategory("产品展示");
            fm.Use(new User("富力士"));

            WebSite fn = f.GetWebSiteCategory("产品展示");
            fn.Use(new User("萨拉赫"));

            Console.WriteLine("得到网站分类总数为 {0}",  f.GetWebSiteCount());

            Console.Read();

        }
    }


组成类图



关系介绍

享元类(Flyweight)是所有具体享元类(ConcreteFlyweight)的接口,是其父类。享元工厂和享元类之间是聚合关系,享元类拥有享元工厂类。客户端(Client)既和具体享元类是关联关系,也和享元工厂类是关联关系。


享元模式的构成

Flyweight(享元类):通过这个接口,享元类可以接受并作用于外部状态。

ConcreteFlyweight(具体享元类):是继承享元类或实现享元类的接口,并为内部状态增加储存空间。

UnsharedConcreteFlyweight(不共享具体享元类):是指那些不需要共享的享元类子类。因为享元类接口共享成为可能,但它并不强制共享。

FlyweightFactory(享元工厂):用来创建并管理享元类对象。


享元模式的优点

1.大大减少对象的创建,降低系统的内存,使效率提高。


使用场景

1.如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的储存开销时就应该考虑使用

2.对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可用相对较少的共享对象取代很多组对象


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值