1. 重复利用对象
  2. gof(c++)中的例子是字处理软件,word(不是自处理,前面一篇更正)

UML类图

image.png

字处理软件

  • word等字处理软件
  • 打一个字符’A’,这个字符可大可小,可以有下划线,可以加粗……(装饰器模式?)
  • 假如每敲一个字符都产生一个对象,那么小对象会特别多
  • 把所有的小对象装到一个池子中去,当要使用某一个小对象的时候就从池子中去拿,不要再new了
  • 享元:共享元对象

坦克项目使用享元(为了设计模式而设计模式)

  • 生成500个子弹
  • 谁要用子弹就去共享池中去拿
  • 子弹飞出范围就使他的alive变为false,不再去绘制这颗子弹,但他仍在池子里
  • 假如要用的时候所有都活着,再return new Bullet();
  • 这本质上就是池化的思想:连接池、线程池 ```java package com.mashibing.dp.flyweight;

import java.util.ArrayList; import java.util.List; import java.util.UUID;

class Bullet{ // 网络上唯一的编号 public UUID id = UUID.randomUUID(); // 默认是alive的,即在使用中 boolean living = true;

  1. @Override
  2. public String toString() {
  3. return "Bullet{" +
  4. "id=" + id +
  5. '}';
  6. }

}

public class BulletPool { List bullets = new ArrayList<>(); { for(int i=0; i<5; i++) bullets.add(new Bullet()); }

  1. public Bullet getBullet() {
  2. for(int i=0; i<bullets.size(); i++) {
  3. Bullet b = bullets.get(i);
  4. // 有空闲子弹时,返回空闲子弹
  5. if(!b.living) return b;
  6. }
  7. // 子弹池里面的子弹都活着的时候(即在使用中的时候),就返回一个新的子弹
  8. return new Bullet();
  9. }
  10. public static void main(String[] args) {
  11. BulletPool bp = new BulletPool();
  12. for(int i=0; i<10; i++) {
  13. Bullet b = bp.getBullet();
  14. System.out.println(b);
  15. }
  16. }

}

  1. <a name="v0qVE"></a>
  2. ## java中的String用的就是享元模式
  3. - 字符串常量池
  4. - intern()指的是某一对象里装的常量池中的对象,拿到常量池中的引用(**面试常问**)
  5. - String对象和String常量是不一样的:String对象里面装的常量对象
  6. - **拓展jvm中的字符串常量池在版本变化中的变化**
  7. - 共享经济--->共产主义
  8. ```java
  9. package com.mashibing.dp.flyweight;
  10. public class TestString {
  11. public static void main(String[] args) {
  12. String s1 = "abc";
  13. String s2 = "abc";
  14. String s3 = new String("abc");
  15. String s4 = new String("abc");
  16. System.out.println(s1 == s2); //true
  17. System.out.println(s1 == s3); //false
  18. System.out.println(s3 == s4); //false
  19. System.out.println(s3.intern() == s1); //true
  20. System.out.println(s3.intern() == s4.intern()); //true
  21. }
  22. }

结合Composite的享元模式(如上UML图)

  • 池中存在着一些组合性的享元(branch和leaf组合)