设计模式(十二)—— 享元模式

## 模式简介 --- > 运用共享技术有效地支持大量细粒度地对象。 通常情况下,面向对象技术可以增强系统地灵活性及可扩展性,在系统开发过程中,我们会不断地增加类和对象。当对象数量过多时,将会带来系统开销过高、性能下降等问题。享元模式通过共享相同或相似的对象来解决这一类问题。在介绍享元模式之前,首先要弄清楚两个概念:**内部状态(Intrinsic State)**和**外部状态(Extrinsic State)**。 - **内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享**。例如,围棋中的棋子,它们的形状和大小完全相同,那么形状、大小则属于内部状态。 - **外部状态是随环境改变而改变的、不可以共享的状态**。享元对象的外部状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。一个外部状态与另一个外部状态之间是相互独立的。例如,棋子的位置各不相同,那么棋子的位置就属于外部状态。 ## 结构说明 --- ![](https://images2018.cnblogs.com/blog/971601/201806/971601-20180619104253903-602508262.png) ### 角色说明 - Flyweight 抽象享元类。包含一个方法,通过这个方法flyweight可以接受外部状态。 - ConcreteFlyweight 具体享元类。实现Flyweight,对象是可共享的。 - UnsharedConcreteFlyweight 非共享享元类。享元模式并不强制共享。 - FlyweightFactory 享元工厂类。创建并管理Flyweight对象。 ### 源码结构 抽象享元类Flyweight,包含一个抽象方法Operation,并接受一个外部状态extrinsiState。 abstract class Flyweight { public abstract void Operation(int extrinsicState); } 具体享元类ConcreteFlyweightA和ConcreteFlyweightB,实现具体的Operation方法。 class ConcreteFlyweightA : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine($"ConcreteFlyweightA->Operation[{extrinsicState}]"); } } class ConcreteFlyweightB : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine($"ConcreteFlyweightB->Operation[{extrinsicState}]"); } } 享元工厂,负责维护一个享元池,用来存储具有相同内部状态的享元对象。 class FlyweightFactory { private Dictionary
posted @ 2018-06-19 19:39 Answer.Geng 阅读(...) 评论(...) 编辑 收藏