享元–共享元数据, 小对象直接放池子里。 用的时候直接拿,不用new.
坦克子弹代码:new 出来的 子弹在List里, 当子弹跑出整个页面时,把它的living标志置为false. 当需要新生成子弹时,把这个子弹位置改下,标志置为true即可。
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
class Bullet{
public UUID id = UUID.randomUUID();
boolean living = true;
@Override
public String toString() {
return "Bullet{" +
"id=" + id +
'}';
}
}
public class BulletPool {
List<Bullet> bullets = new ArrayList<>();
{
for (int i = 0; i < 5; i++) {
bullets.add(new Bullet());
}
}
public Bullet getBullet(){
for (int i = 0; i < bullets.size(); i++) {
Bullet bullet = bullets.get(i);
if(!bullet.living){
bullet.living = true;
return bullet;
}
}
return new Bullet();
}
public static void main(String[] args) {
BulletPool bulletPool = new BulletPool();
for (int i = 0; i < 10; i++) {
Bullet bullet = bulletPool.getBullet();
System.out.println(bullet);
}
}
}
**Java里的String就是用的享元模式。Java里的String所有的字符串都放在一个常量池里。 **
public class TestSpring {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2); true
System.out.println(s1 == s3); false
System.out.println(s3 == s4); false
System.out.println(s3.intern() == s1); true s3.intern new String("参数是常量") 也指向常量池。
System.out.println(s3.intern() == s4.intern()); true
}
}
结合Composite的Flyweight. 就是组合的享元。 例如下图的AbABBA就是由前面的 A , B 组成的。