[4] [对象性能] ( 2 ) 享元模式 Flyweight
总结
-
干什么用的?
避免了创建大量相似对象, 减少了内存占用.
(可以简单理解为一个对象池)
-
细节
把实例的共享状态和非共享状态分开.
(画图工具例子中的颜色是共享的, X Y 半径是非共享的)
-
场景
String常量池
数据库连接池
缓冲池
文字编辑器
图形应用
游戏开发
java例子1
重构前
package v20_flyweight.java;
class Circle {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color) {
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
public void draw() {
System.out.printf("Drawing circle of color %s at position (%d, %d) with radius %d\n", color, x, y, radius);
}
}
public class DrawingApp1 {
public static void main(String[] args) {
Circle redCircle = new Circle("red");
redCircle.setX(10);
redCircle.setY(10);
redCircle.setRadius(50);
redCircle.draw();
Circle blueCircle = new Circle("blue");
blueCircle.setX(20);
blueCircle.setY(20);
blueCircle.setRadius(60);
blueCircle.draw();
}
}
重构后
package v20_flyweight.java;
import java.util.HashMap;
import java.util.Map;
interface Shape {
void draw(int x, int y, int radius);
}
class CircleFlyweight implements Shape { // CircleFlyweight对象最好是只读的
private String color; // color是共享状态
public CircleFlyweight(String color) {
this.color = color;
}
// x,y,radius是非共享状态
@Override
public void draw(int x, int y, int radius) {
System.out.printf("Drawing circle of color %s at position (%d, %d) with radius %d\n",
color, x, y, radius);
}
}
class ShapeFactory {
// CircleFlyweight对象最好是只读的
private static final Map<String, CircleFlyweight> circleMap = new HashMap<>();
public static CircleFlyweight getCircle(String color) {
CircleFlyweight circle = circleMap.get(color);
if (circle == null) {
circle = new CircleFlyweight(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color: " + color);
}
return circle;
}
}
public class DrawingApp2 {
public static void main(String[] args) {
CircleFlyweight redCircle = ShapeFactory.getCircle("red");
redCircle.draw(10, 10, 50);
CircleFlyweight blueCircle = ShapeFactory.getCircle("blue");
blueCircle.draw(20, 20, 60);
CircleFlyweight anotherRedCircle = ShapeFactory.getCircle("red");
anotherRedCircle.draw(30, 30, 40);
}
}
- 结构
![image]()

浙公网安备 33010602011771号