• C#设计模式——享元模式(Flyweight Pattern)


    一、概述

    在软件开发中,我们有时需要创建大量细粒度的对象,比如文档处理系统就可能需要创建成千上万的字符对象。但如果对每个字符对象都分配内存,那么在系统运行时就会耗费大量的内存。如何在保留面向对象操作方式优点的同时避免创建大量的对象呢?这就到了享元模式发挥作用的时候了。

    二、享元模式

    享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。其结构图如下:

    Flyweight定义了享元接口,外部对象通过这个接口来访问具体的享元对象。

    ConcreteFlyweight实现Flyweight接口,定义了具体的享元对象,并保存享元对象的内部状态。该享元对象是可共享的。

    UnsharedConcreteFlyweight实现Flyweight接口,定义了不用于共享的享元对象。

    FlyweightFactory创建并管理享元对象。

    Client保存对享元接口的引用,通过该引用有效的使用具体的享元对象。

    三、示例

    我们简单的实现本文开头所表述的文档处理系统。

    首先定义Flyweight。

     1     public abstract class Character
     2     {
     3         public int Size { get; set; }
     4         public Color Color { get; set; }
     5         protected char _c;
     6 
     7         public Character()
     8         {
     9             Size = 10;
    10             Color = Color.Black;
    11         }
    12 
    13         public override string ToString()
    14         {
    15             return string.Format("Character is {0}, Size is {1}, Color is {2}", _c, Size.ToString(), Color.ToString());
    16         }
    17     }

    然后实现具体的享元对象。

     1     public class CharacterA : Character
     2     {
     3         public CharacterA()
     4         {
     5             _c = 'A';
     6         }
     7     }
     8 
     9     public class CharacterB : Character
    10     {
    11         public CharacterB()
    12         {
    13             _c = 'B';
    14         }
    15     }
    16 
    17     public class CharacterC : Character
    18     {
    19         public CharacterC()
    20         {
    21             _c = 'C';
    22         }
    23     }

    接着定义FlyweightFactory并建立共享池。

     1     public static class CharacterFactory
     2     {
     3         private static Dictionary<char, Character> _characters;
     4 
     5         static CharacterFactory()
     6         {
     7             _characters = new Dictionary<char, Character>();
     8             _characters.Add('a', new CharacterA());
     9             _characters.Add('b', new CharacterB());
    10             _characters.Add('c', new CharacterC());
    11         }
    12 
    13         public static Character GetCharacter(char c)
    14         {
    15             return _characters[c];
    16         }
    17     }

    最后看一下如何使用这些享元对象。

     1     static void Main(string[] args)
     2     {
     3         Character character = CharacterFactory.GetCharacter('a');
     4         Console.WriteLine(character.ToString());
     5         character = CharacterFactory.GetCharacter('b');
     6         character.Size = 20;
     7         character.Color = Color.Red;
     8         Console.WriteLine(character.ToString());
     9         character = CharacterFactory.GetCharacter('c');
    10         character.Size = 15;
    11         character.Color = Color.Yellow;
    12         Console.WriteLine(character.ToString());
    13     }
  • 相关阅读:
    elasticsearch配置文件
    elk+filebeat源码安装
    logstash配置文件
    kibana配置文件
    filebeat配置文件
    老年人和棒子(李敖)
    Linux下傻瓜式安装配置V_2_r_a_y
    【有关学习Q国的自动化工具的学习思路】
    有关在使用aireplay-ng处理5Ghz频段的wifi时出现“No such Bssid available”的解决方法
    springboot整合日志logback
  • 原文地址:https://www.cnblogs.com/saville/p/2916301.html
Copyright © 2020-2023  润新知