设计模式之美:Flyweight(享元)

简介:

索引

意图

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

Use sharing to support large numbers of fine-grained objects efficiently.

结构

下面的对象图说明了如何共享 Flyweight:

参与者

Flyweight

  • 描述一个接口,通过这个接口 Flyweight 可以接受并作用于外部状态。

ConcreteFlyweight

  • 实现 Flyweight 接口,并为内部状态增加存储空间。该对象必须是可共享的。它所存储的状态必须是内部的,即必须独立于对象的场景。

UnsharedConcreteFlyweight

  • 并非所有的 Flyweight 子类都需要被共享。Flyweight 接口使共享成为可能,但它并不强制共享。

FlyweightFactory

  • 创建并管理 Flyweight 对象。
  • 确保合理地共享 Flyweight。

Client

  • 维持一个对 Flyweight 的引用。
  • 计算或存储 Flyweight 的外部状态。

适用性

Flyweight 模式的有效性很大程度上取决于如何使用它以及在何处使用它。

当以下情况成立时可以使用 Flyweight 模式:

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。

效果

  • 存储空间上的节省抵消了传输、查找和计算外部状态时的开销。节约量随着共享状态的增多而增大。

相关模式

  • Flyweight 模式通常和 Composite 模式结合起来,用共享叶节点的又向无环图实现一个逻辑上的层次结构。
  • 通常,最好用 Flyweight 实现 State 和 Strategy 对象。

实现

实现方式(一):使用 FlyweightFactory 管理 Flyweight 对象。

Flyweight 模式的可用性在很大程度上取决于是否易识别外部状态并将它从共享对象中删除。

理想的状况是,外部状态可以由一个单独的对象结构计算得到,且该结构的存储要求非常小。

通常,因为 Flyweight 对象是共享的,用户不能直接对它进行实例化,因为 FlyweightFactory 可以帮助用户查找某个特定的 Flyweight 对象。

共享还意味着某种形式的引用计数和垃圾回收。

复制代码
 1 namespace FlyweightPattern.Implementation1
 2 {
 3   public abstract class Flyweight
 4   {
 5     public abstract string Identifier { get; }
 6     public abstract void Operation(string extrinsicState);
 7   }
 8 
 9   public class ConcreteFlyweight : Flyweight
10   {
11     public override string Identifier
12     {
13       get { return "hello"; }
14     }
15 
16     public override void Operation(string extrinsicState)
17     {
18       // do something
19     }
20   }
21 
22   public class FlyweightFactory
23   {
24     private Dictionary<string, Flyweight> _pool
25       = new Dictionary<string, Flyweight>();
26 
27     public Flyweight CreateFlyweight(string identifier)
28     {
29       if (!_pool.ContainsKey(identifier))
30       {
31         Flyweight flyweight = new ConcreteFlyweight();
32         _pool.Add(flyweight.Identifier, flyweight);
33       }
34 
35       return _pool[identifier];
36     }
37   }
38 
39   public class Client
40   {
41     public void TestCase1()
42     {
43       FlyweightFactory factory = new FlyweightFactory();
44       Flyweight flyweight1 = factory.CreateFlyweight("hello");
45       Flyweight flyweight2 = factory.CreateFlyweight("hello");
46       flyweight1.Operation("extrinsic state");
47       flyweight2.Operation("extrinsic state");
48     }
49   }
50 }
复制代码
目录
相关文章
|
7月前
|
设计模式 存储 安全
二十三种设计模式全面解析-享元模式(Flyweight Pattern)详解:构建高效共享的对象结构
二十三种设计模式全面解析-享元模式(Flyweight Pattern)详解:构建高效共享的对象结构
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——享元模式Flyweight(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——享元模式Flyweight(原理讲解+应用场景介绍+案例介绍+Java代码实现)
69 0
|
设计模式 存储 数据库
认真学习设计模式之享元模式(Flyweight Pattern)
认真学习设计模式之享元模式(Flyweight Pattern)
70 0
|
设计模式 存储 缓存
设计模式~享元模式(flyweight)-09
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例:
50 0
|
设计模式 Java 数据库
Java设计模式-享元模式(Flyweight Pattern)
Java设计模式-享元模式(Flyweight Pattern)
|
存储 设计模式 缓存
【设计模式】享元
【设计模式】享元
140 0
【设计模式】享元
|
设计模式 存储 Java
从零开始学设计模式(十二):享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)指的是运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
305 0
从零开始学设计模式(十二):享元模式(Flyweight Pattern)
|
设计模式 缓存 定位技术
设计模式是什么鬼(享元)
设计模式是什么鬼(享元)
设计模式是什么鬼(享元)
|
存储 设计模式 缓存
设计模式实战之享元模式(Flyweight Pattern)
设计模式实战之享元模式(Flyweight Pattern)
170 0
设计模式实战之享元模式(Flyweight Pattern)
|
设计模式 数据库连接
【愚公系列】2021年12月 二十三种设计模式(十一)-享元模式(Flyweight Pattern)
【愚公系列】2021年12月 二十三种设计模式(十一)-享元模式(Flyweight Pattern)
【愚公系列】2021年12月 二十三种设计模式(十一)-享元模式(Flyweight Pattern)