享元模式(Flyweight Pattern)属于结构型模式。主要用于减少创建的对象数量,来减少内存占用,提高性能。用法是将很多对象分为几类,确定每个类对象的唯一标示,可以用HashMap存储。
简单的demo:
画很多圆的时候,不需要每个圆形都创建一个对象,假设创建不同颜色的画笔是一个很大的开销,就可以以颜色进行分类,一种颜色的圆形只创建一个对象。
画图形的接口:
public interface Shape {
void draw();
}
圆形的类
public class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
// 初始化的时候传入颜色
public Circle(String color) {
this.color = color;
}
// 圆心可以动态设置
public void setCircleCenter(int x, int y) {
this.x = x;
this.y = y;
}
// 半径可以动态设置
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("画了一个圆: 颜色是" + color + ",圆心是(" + x + "," + y + "),半径是" + radius);
}
}
创建圆形的类:
public class CircleFactory {
// 圆的颜色
public static final String colors[] = {"红色", "蓝色", "绿色", "白色", "黑色"};
// 通过HashMap缓存创建的圆形
private static final HashMap<String, Shape> circleMap = new HashMap<>();
// 获取圆形对象
public static Shape getShape(String color) {
Circle circle = (Circle) circleMap.get(color);
if (circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("画了一个" + color + "的圆,圆心是(" + x + "," + y + "),半径是" + radius);
}
return circle;
}
}
调用:
for (int i = 0; i < 8; i++) {
String color = CircleFactory.colors[(int) (Math.random() * CircleFactory.colors.length)];
Circle circle = (Circle) CircleFactory.getShape(color);
circle.setCircleCenter((int) (Math.random() * 100), (int) (Math.random() * 100));
circle.setRadius((int) (Math.random() * 100));
circle.draw();
}
输出结果是:
创建一个红色的圆形对象
画了一个红色的圆,圆心是(62,8),半径是10
画了一个红色的圆,圆心是(30,5),半径是37
创建一个白色的圆形对象
画了一个白色的圆,圆心是(92,76),半径是73
创建一个绿色的圆形对象
画了一个绿色的圆,圆心是(3,99),半径是63
画了一个红色的圆,圆心是(77,46),半径是11
画了一个绿色的圆,圆心是(54,46),半径是76
创建一个蓝色的圆形对象
画了一个蓝色的圆,圆心是(56,18),半径是50
画了一个蓝色的圆,圆心是(51,19),半径是47