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

简介:

一、享元模式简介(Brief Introduction

享元模式( Flyweight Pattern , 运用共享技术有效支持大量细粒度的对象。
Use sharing to support large numbers of fine-grain ed objects efficiently.
享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅度第减少需要实例化的类的数量。如果能把这些参数移到类实例外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
享元对象的内部状态与外部状态:
内部状态,在享元对象的内部并且不会随环境改变而改变的共享部分。
外部状态,随环境改变而改变的,不可以共享的状态。

二、解决的问题(What To Solve

        如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销,这时可以考虑使用享元模式。
        当对象的大多数状态是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,这时也可以考虑使用享元模式。

三、享元模式分析(Analysis

1、享元模式结构

 
FlyweightFactory : 享元工厂,用来创建和管理 Flyweight 对象。如果请求的 Flyweight 对象存在,怎返回已经存在的对象。否则新创建一个新的对象返回。
Flyweight :享元抽象类,通过这个接口, Flyweight 可以接受并作用与外部状态。
UnsharedConcreteFlyweight :不需要共享的 Flyweight 子类。 Flyweight 接口并不强制共享。
ConcreteFlyweight :实现享元抽象类,为内部状态添加存储空间。

2、代码

1 、享元工厂类 FlyweightFactory
public  class FlyweightFactory
{
    public Hashtable  flyweights = new Hashtable ();
 
    public  FlyweightFactory()
     {
         flyweights.Add("A" new ConcreteFlyweight ());
         flyweights.Add("B" new ConcreteFlyweight ());
         flyweights.Add("C" new ConcreteFlyweight ());
     }
 
    public Flyweight  GetFlyweight(string  key)
     {
        return  flyweights[key] as Flyweight ;
     }
}
 
2 、享元抽象类 Flyweight  及其具体实现类UnsharedConcreteFlyweight
ConcreteFlyweight
public  abstract class Flyweight
{
    public abstract void  Operation(int  extrinsicstate);
}
 
public  class UnsharedConcreteFlyweight :Flyweight
{
    public override void  Operation(int  extrinsicstate)
     {
        Console .WriteLine("{0}:{1}" ,this .GetType().Name,extrinsicstate);
     }
}
 
public  class ConcreteFlyweight :Flyweight
{
    public override void  Operation(int  extrinsicstate)
     {
        Console .WriteLine("{0}:{1}" this .GetType().Name, extrinsicstate);
     }
}
 
3 、客户端代码
static  void Main (string [] args)
{
    // Arbitrary extrinsic state
    int  extrinsicstate = 20;
    FlyweightFactory  factory = new FlyweightFactory ();
 
    // Work with different flyweight instances
    Flyweight  fx = factory.GetFlyweight("A" );
     fx.Operation(--extrinsicstate);
 
    Flyweight  fy = factory.GetFlyweight("B" );
     fy.Operation(--extrinsicstate);
 
    Flyweight  fz = factory.GetFlyweight("C" );
     fz.Operation(--extrinsicstate);
 
    UnsharedConcreteFlyweight  fu = new UnsharedConcreteFlyweight ();
     fu.Operation(--extrinsicstate);
 
    Console .ReadKey();
}

3、实例运行结果










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

目录
相关文章
|
25天前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
2月前
|
设计模式 存储 JavaScript
js设计模式【详解】—— 享元模式
js设计模式【详解】—— 享元模式
40 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月前
|
设计模式 Java 开发者
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
【搞懂设计模式】享元模式:共享节约,皆大欢喜!
61 0
|
4月前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
26天前
|
设计模式
设计模式-单一职责模式
设计模式-单一职责模式