经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
结构型模式之享元模式
来源:cnblogs  作者:yewen1234  时间:2018/12/7 9:28:49  对本文有异议

享元模式(Flyweight Pattern)是池技术的重要实现方式,可以降低大量重复的、细粒度的类在内存中的开销。

定义:

  • 使用共享对象可有效地支持大量的细粒度对象。
  • 以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。
  1. 内部状态是存储在享元对象内部的、可以共享的信息,并且不会随环境改变而改变。
  2. 外部状态是随环境改变而改变且不可以共享的状态。享元对象的外部状态必须由客户端保存,并在享元对象被创建后,在需要使用的时候再传入到享元对象内部。

享元模式的类图如下所示。

享元模式具有以下4个角色:

  • 抽象享元(Flyweight)角色:对享元类进行抽象,需要外部状态的操作可以通过参数的形式将外部状态传入。
  • 具体享元(ConcreteFlyweight)角色:实现抽象享元定义的业务,注意享元对象的内部状态必须与环境无关,从而使得享元对象可以在系统内共享。
  • 享元工厂(FlyweightFactory)角色:构造一个池容器,负责创建和管理享元角色,并提供从池容器中获得对象的方法,保证享元对象可以被系统适当的共享。当一个客户端对象请求一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂则提供这个已有的享元对象,否则创建一个合适的享元对象。
  • 客户端角色:自行存储所有享元对象的外部状态。

Flyweight.java

  1. public interface Flyweight {
  2. // 业务方法
  3. public abstract void operation(String extrinsicState);
  4. }

ConcreteFlyweight.java

  1. public class ConcreteFlyweight implements Flyweight {
  2. private String intrinsicState;// 内部状态
  3. public ConcreteFlyweight(String intrinsicState) {
  4. this.intrinsicState = intrinsicState;
  5. }
  6. @Override
  7. public void operation(String extrinsicState) {
  8. System.out.println("内部状态" + intrinsicState + ",外部状态:" + extrinsicState);
  9. }
  10. @Override
  11. public String toString() {
  12. return "内部状态=" + intrinsicState;
  13. }
  14. }

FlyweightFactory.java

  1. public class FlyweightFactory {
  2. private static Map<String, Flyweight> pool = new HashMap<String, Flyweight>();
  3. private FlyweightFactory(){} // 私有构造方法
  4. public static Flyweight getFlyweight(String intrinsicState) {
  5. Flyweight flyweight = pool.get(intrinsicState);
  6. if (flyweight == null) {
  7. flyweight = new ConcreteFlyweight(intrinsicState);
  8. pool.put(intrinsicState, flyweight);
  9. }
  10. return flyweight;
  11. }
  12. }

Client.java

  1. public class Client {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < 5; i++) {
  4. Flyweight flyweight = FlyweightFactory.getFlyweight("" + i);
  5. flyweight.operation("" + (i + 1));
  6. }
  7. Flyweight flyweight = FlyweightFactory.getFlyweight("0");
  8. System.out.println(flyweight);
  9. }
  10. }

优点:

  • 大幅减少内存中对象的数量,降低程序内存的占用,提高性能。但是相应付出的代价也很高。

缺点:

  • 享元模式增加了系统的复杂性,需要分出外部状态和内部状态,而且内部状态具有固化特性,不应该随外部状态改变而改变,使得程序逻辑复杂化。
  • 享元对象将享元对象的状态外部化,而读取外部状态使得运行时间变长。

使用场景:

  • 系统中有大量相似对象,这些对象耗费大量内存。
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,即对象没有特定身份。
  • 需要缓冲池的场景。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,103-105.

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号