设计模式之享元模式

  享元模式,属于创建型设计模式,它主要是用来减少创建对象的数量,以达到减少内存占用和提高性能的目的,通常与工厂模式一起使用。

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

  问题描述:当系统中存在大量的对象时,就有可能会造成内存溢出。

  解决方案:把这些对象中共同的部分抽象出来,如果有相同的业务请求,直接返回给内存中已有的对象,避免对象的重新创建。

  结构图

  举个栗子:讲一个黑色棋子和白色棋子的故事。。。

  故事中,黑色棋子和白色棋子可以共享,但是它们可以在棋盘上放置到不同的位置,那么位置就是棋子的外部状态,棋子本身作为其内部状态,作为享元角色,并由一个享元工厂负责创建和管理。具体实现方式如下:

  1. 新建一个抽象享元类Chessman,它是一个接口,定义了棋子必须实现的方法,包括内部状态和外部状态。代码如下:

          

  2. 分别新建两个具体享元类,黑色棋子BlackChessman和白色棋子WhiteChessman,均实现接口Chessman中定义的方法。代码如下:

          

          

  3. 新建一个享元工厂类ChessmanFactory,负责创建和管理享元角色。代码如下:

          

  4. 在使用者类中通过享元工厂类的实例分别创建黑色棋子和白色棋子,并分别设置各自的位置(外部状态)。代码如下:

          

  5. 运行后的效果,如图所示:

          

  以上就是享元模式的实现方式,由棋子判断是否相同我们可以看出黑色棋子或白色棋子在内存中只保存了一个对象,这样在一定程度上减少了内存中对象的个数,从而节约了系统资源,并且享元的外部状态相对独立,不会影响到内部状态,从而使得享元可以在不同的环境下被共享,提高了享元的复用能力,提高了系统性能。

  优点:大大减少了对象的创建,降低了系统的内存,提高了系统性能。

  缺点:提高了系统的复杂度,因为需要分离出享元的外部状态和内部状态;维护享元对象需要额外的开销。

  适用场景

  1. 系统中存在大量的相似的对象;

  2. 需要缓冲池的场景。

原文地址:https://www.cnblogs.com/chenxkang/p/6764408.html