享元模式FlyWeight

场景:如果有很多个完全相同或者相似的对象,可以节省内存资源

核心:

享元模式以共享的方式高效地支持大量细粒对象的重用

享元对象做到共享的关键是区分了内部状态和外部状态:

内部状态:可以共享,不会随环境变化而变化(共有的部分)

外部状态:不可以共享,会随环境变化而改变(独特的部分)

享元模式的实现:

-FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对

-FlyWeight抽象享元类 :通常是一个接口或抽象类 声明公共方法,这些方法可以向外界提供对象的内部状态 设置外部状态

-ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行储存

-UnsharedConcreteFlyWeught非共享享元类:不能被共享的子类可以设计成非共享享元类

在实际中的场景:线程池,数据库连接池,String类

优点:极大减少内存中对象的数量;相同或者相似的对象只存一份,节约资源;外部状态相对独立,不影响内部状态

缺点:模式复杂,程序逻辑复杂化;为了节省内存,共享了内部状态,分理出外部状态,读取外部状态使运行时间变长,时间换取空间

例如:围棋(内部状态:颜色形状大小  外部状态:位置)

/**
 * 外部状态类UnsharedConcreteFlyWeight
 * @author 小帆敲代码
 *
 */
public class Point {
 private int x;
 private int y;
 
public Point(int x, int y) {
 this.x = x;
 this.y = y;
}
public int getX() {
 return x;
}
public void setX(int x) {
 this.x = x;
}
public int getY() {
 return y;
}
public void setY(int y) {
 this.y = y;
}
}
/**
 * 享元类
 * @author 小帆敲代码
 *
 */
public interface Chess {
  void setColor(String color);
  String getColor();
  void display(Point p);
}
class ConcreteChess implements Chess{
  private String color;
  
 public ConcreteChess(String color) {
   this.color = color;
  }
 @Override
 public void setColor(String color) {
  this.color=color;
 }
 @Override
 public String getColor() {
  return this.color;
 }
 @Override
 public void display(Point p) {
  System.out.println(color+"棋"+"在("+p.getX()+","+p.getY()+")点显示");
 }
}
/**
 * 享元工厂
 * @author 小帆敲代码
 *
 */
public class FlyWeightFactory {
  //享元池
 private static  Map<String,Chess> map=new HashMap<String,Chess>();
 public static Chess getChess(String color) {
  if(!map.containsKey(color)) {
   map.put(color, new ConcreteChess(color));
  }
  return map.get(color);
 }
}
public class Client {
  public static void main(String[] args) {
     Chess c1=FlyWeightFactory.getChess("黑");
     Chess c2=FlyWeightFactory.getChess("黑");
     System.out.println(c1);
     System.out.println(c2);
     System.out.println("增加外部状态-----");
     c1.display(new Point(10,10));
     c2.display(new Point(15,15));
  }
}

最新文章

  1. C++中有关数组的相关问题
  2. 直接在 CSS 中引用 FONTAWESOME 图标(附码表)
  3. Axure简介
  4. iTween基础之Fade(淡入淡出)
  5. Fast portable non-blocking network programming with Libevent--转
  6. String对象
  7. 解决同一PC同一浏览器session共享问题
  8. 文本框文字垂直居中 CSS
  9. Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  10. zabbix主动上报的python脚本
  11. 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG
  12. ECharts的简单使用
  13. JavaScript(第九天)【正则表达式】
  14. Go语言-通道类型
  15. commandArgument用于绑定一个传递的参数
  16. 数据泵expdp 在rac环境下 paralle 的处理方法
  17. python之+=与+(转载)
  18. Java编译时多态和运行时多态
  19. Active Learning
  20. JDBC流ASCII和二进制数据

热门文章

  1. Python——详解__slots__,property和私有方法
  2. [git] github上传项目(使用git)、删除项目、添加协作者
  3. 模糊字符串匹配:FuzzyWuzzy
  4. 十分钟搞懂Elasticsearch数字搜索原理
  5. tp5--开发规范
  6. bootstrop日历
  7. SQLI-LABS学习笔记(二)
  8. sql注入学习笔记
  9. Linux网络管理员:网络概论
  10. Shoutem旨在成为React Native移动应用领域的WordPress