ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式——享元模式

2019-05-12 15:49:06  阅读:234  来源: 互联网

标签:享元 extrinsicstate WebSite flyweights 模式 Flyweight new 设计模式 public


定义

运用共享技术有效地支持大量细粒度的对象

两种状态:

内部状态:在享元对象内部并且不会随环境改变的共享部分。
外部状态:随环境的变化发生改变的,不可以共享的状态的外部状态。

特点

享元模式可以避免大量给常相似类的开销,在程序设计中有时需要生成大量细粒度的类的实例来表示数据,如果能发现这些实例除了几个参数外基本上都是相同的有时就能够收大富度的减少需要实例化的数量,如果能把那些参数移到类实例的外面,在方法调用时将他们传递进来看,就可以通过共享大富度的减少单个实例的数目。

结构图

在这里插入图片描述

享元模式模板代码:

//Flyweight 类,它是所有具体享原类的超类或者接口通过这个接口,可以接受并作用于外部状态

 abstract class Flyweight
    {
        public abstract void Operation(int extrinsicstate);
    }
 

//concreteFlyweight,继承Flyweight超类或实现Flyweight接口,并为内部转台增加存储空间

  
    class ConcreteFlyweight:Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("具体Flyweight:" + extrinsicstate);
        }
    }
    

unsharedconcreteflyweight不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但她不强制共享

    
    class UnshareConcreteFlyweight:Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("不共享的具体Flyweight" + extrinsicstate);
        }
    }

FlyweightFactory享元工厂,创建并管理Flyweight对象,它主要是用来确保合理的共享Flyweight,当用户请求一个Flyweight时,Flyweightfactory可以提供一个已经创建的实例或者创建一个

class FlyweightFactory
    {
        private Hashtable flyweights = new Hashtable();
        public FlyweightFactory()
        {
            flyweights.Add("X", new ConcreteFlyweight());
            flyweights.Add("y", new ConcreteFlyweight());
            flyweights.Add("z", new ConcreteFlyweight());
        }
        public Flyweight GetFlyweight(string key)
        {
            return ((Flyweight)flyweights[key]);
        }
       
    }
}

客户端代码

class Program
    {
        static void Main(string[] args)
        {
            int extrinsicstate = 22;

            FlyweightFactory f = new FlyweightFactory();

            Flyweight fx = f.GetFlyweight("X");
            fx.Operation(--extrinsicstate);

            Flyweight fy = f.GetFlyweight("Y");
            fx.Operation(--extrinsicstate);

            Flyweight fz = f.GetFlyweight("Z");
            fx.Operation(--extrinsicstate);

            Flyweight uf = new UnshareConcreteFlyweight();

            uf.Operation(--extrinsicstate);
            Console.Read();
              }
      }
    

实例:

namespace 第二十六章网站共享代码
{
    //网站抽象类
    abstract class WebSite
    {
        public abstract void Use();
    }

    //具体网站类
    class ConcreteWebSite:WebSite
    {
        private string name = "";
        public ConcreteWebSite (string name)
        {
            this.name = name;
        }
        public override void Use()
        {
            Console.WriteLine("网站分类:" + 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();

            WebSite fy = f.GetWebSiteCategory("产品展示");
            fy.Use();


            WebSite fz = f.GetWebSiteCategory("博客");
            fz.Use();

            WebSite fl = f.GetWebSiteCategory("售货");
            fl.Use();

            WebSite fm = f.GetWebSiteCategory("相亲");
            fm.Use();
            Console.WriteLine("网站分类总数为{0}", f.GetWebSiteCount());
            Console.Read();



        }
    }
}

标签:享元,extrinsicstate,WebSite,flyweights,模式,Flyweight,new,设计模式,public
来源: https://blog.csdn.net/weixin_40486955/article/details/90141206

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有