• 设计模式学习笔记享元模式


    概述:                                                                                                       

    享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

    适用场合:                                                                                                 

    1.一个应用程序使用了大量的对象。

    2.完全由大量的对象,造成很大的存储开销。

    3.对象的大多数状态都可变为外部状态。

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

    5.应用程序不依赖于对象标识,由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

    类图:                                                                                                       

    代码示例:                                                                                                 

    1.享元类的超类或者接口

        /// <summary>
    /// 具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于
    /// 外部状态
    /// </summary>
    abstract class Flyweight
    {
    public abstract void Operation(int extrinsicstate);
    }

    2.实现Flyweight接口

        /// <summary>
    /// 实现Flyweight接口,并为内部状态增加存储空间
    /// </summary>
    class ConcreteFlyweight:Flyweight
    {
    public override void Operation(int extrinsicstate)
    {
    Console.WriteLine(
    "具体Flyweight:"+extrinsicstate);
    }
    }

    3.不需要共享的Flyweight子类

        /// <summary>
    /// 不需要共享的Flyweight子类,因为Flyweight接口共享成为可能
    /// 但它并不强制共享
    /// </summary>
    class UnsharedConcreteFlyweight:Flyweight
    {
    public override void Operation(int extrinsicstate)
    {
    Console.WriteLine(
    "不共享的具体Flyweight:"+extrinsicstate);
    }
    }

    4.享元工厂

        /// <summary>
    /// 享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享
    /// Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象
    /// 提供一个已创建的实例或者创建一个
    /// </summary>
    class FlyweightFactory
    {
    private Hashtable flyweights = new Hashtable();

    /// <summary>
    /// 初始化工厂时先生成三个实例
    /// </summary>
    public FlyweightFactory()
    {
    flyweights.Add(
    "X",new ConcreteFlyweight());
    flyweights.Add(
    "Y",new ConcreteFlyweight());
    flyweights.Add(
    "Z",new ConcreteFlyweight());
    }
    /// <summary>
    /// 根据客户端请求生成的实例
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public Flyweight GetFlyweight(string key)
    {
    return (Flyweight)flyweights[key];
    }
    }

    6.客户端调用

            /// <summary>
    /// 测试享元模式
    /// </summary>
    static void TestFlyweight()
    {
    //外部状态
    int extrinsisctate = 22;

    FlyweightFactory f
    = new FlyweightFactory();
    Flyweight fx
    = f.GetFlyweight("X");
    fx.Operation(
    --extrinsisctate);

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

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

    UnsharedConcreteFlyweight uf
    = new UnsharedConcreteFlyweight();
    uf.Operation(
    --extrinsisctate);

    Console.Read();
    }

    小结:                                                                                                    

    享元模式是用来节省内存开销的,我们不需要重复实例化得到一个相同的对象,只需共享这个对象就行了。

    享元模式的延伸意义就是对象池(Object Pool),通过池子来取得对象实例,而不需要每一次去实例化这个对象,池子中有现成的。

  • 相关阅读:
    POJ 1258 Agri-Net (prim水题)
    POJ 1258 Agri-Net (prim水题)
    Call to your teacher
    Call to your teacher
    Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)
    用R语言求置信区间
    用R语言求置信区间
    竞品分析报告正确的打开方式
    竞品分析报告正确的打开方式
    内容分析在用户反馈分析中的应用
  • 原文地址:https://www.cnblogs.com/jqbird/p/2168482.html
Copyright © 2020-2023  润新知