Net设计模式实例之享元模式( Flyweight Pattern)(2)

简介:

四.享元模式实例分析(Example

1、场景

一个文档 Document 中只有少数字符需要共享。结构 如下图所示
 
CharacterFactory ,享元工厂,用来创建和管理 Charactor 对象。如果请求的 Charactor 对象存在,怎返回已经存在的对象。否则新创建一个新的对象返回。
Character :享元抽象类,通过这个接口, Character 可以接受并作用与外部状态。
CharacterA /CharacterB/CharacterC  :实现享元抽象类,为内部状态添加存储空间。

2、代码

1 字符工厂类CharacterFactory
class  CharacterFactory
{
    private Dictionary <char Character > _characters = new Dictionary <char Character >();
    public Character  GetCharacter(char  key)
     {
        // Uses "lazy initialization"
        Character  character = null ;
        if  (_characters.ContainsKey(key))
         {
             character = _characters[key];
         }
        else
         {
            switch  (key)
             {
                case 'A' : character = new CharacterA (); break ;
                case 'B' : character = new CharacterB (); break ;
                //...
                case 'Z' : character = new CharacterZ (); break ;
             }
             _characters.Add(key, character);
         }
        return  character;
     }
}
 
2 抽象数据对象类DataObject 及其具体实现类CustomersData
///   <summary>
///  The 'Flyweight' abstract class
///   </summary>
abstract  class Character
{
    protected char  symbol;
    protected int  width;
    protected int  height;
    protected int  ascent;
    protected int  descent;
    protected int  pointSize;
    public abstract void  Display(int  pointSize);
}
///   <summary>
///  A 'ConcreteFlyweight' class
///   </summary>
class  CharacterA  : Character
{
    public  CharacterA()
     {
        this .symbol = 'A' ;
        this .height = 100;
        this .width = 120;
        this .ascent = 70;
        this .descent = 0;
     }
    public override void  Display(int  pointSize)
     {
        this .pointSize = pointSize;
        Console .WriteLine(this .symbol + " (pointsize "  + this .pointSize + ")" );
     }
}
///   <summary>
///  A 'ConcreteFlyweight' class
///   </summary>
class  CharacterB  : Character
{
    public  CharacterB()
     {
        this .symbol = 'B' ;
        this .height = 100;
        this .width = 140;
        this .ascent = 72;
        this .descent = 0;
     }
    public override void  Display(int  pointSize)
     {
        this .pointSize = pointSize;
        Console .WriteLine(this .symbol + " (pointsize "  + this .pointSize + ")" );
     }
}
// ... C, D, E, etc.
///   <summary>
///  A 'ConcreteFlyweight' class
///   </summary>
class  CharacterZ  : Character
{
    // Constructor
    public  CharacterZ()
     {
        this .symbol = 'Z' ;
        this .height = 100;
        this .width = 100;
        this .ascent = 68;
        this .descent = 0;
     }
    public override void  Display(int  pointSize)
     {
        this .pointSize = pointSize;
        Console .WriteLine(this .symbol +" (pointsize "  + this .pointSize + ")" );
     }
}
 
3 、客户端代码
static  void Main (string [] args)
{
    // Build a document with text
    string  document = "AAZZBBZB" ;
    char [] chars = document.ToCharArray ();
    CharacterFactory  factory = new CharacterFactory ();
    // extrinsic state
    int  pointSize = 10;
    // For each character use a flyweight object
    foreach  (char  c in  chars)
     {
         pointSize++;
        Character  character = factory.GetCharacter(c);
         character.Display(pointSize);
     }
    Console .ReadKey();
}

3、实例运行结果

五、总结(Summary

本文对享元模式( Flyweight Pattern )的概念、设计结构图、代码、使用场景、进行了描述。以一个享元模式实例进行了说明。如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销,这时可以考虑使用享元模式。









本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/269010,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
2月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
39 6
|
3月前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
3月前
|
设计模式 存储 Java
Java设计模式之享元模式详解
Java设计模式之享元模式详解
|
3月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
3月前
|
设计模式
享元模式-大话设计模式
享元模式-大话设计模式
|
4月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
4月前
|
设计模式 Go
[设计模式 Go实现] 结构型~享元模式
[设计模式 Go实现] 结构型~享元模式
|
4月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
57 0
|
4月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式